Как grep искать имена файлов вместо содержимого в Linux
grep
– это инструмент Linux, который обычно используется для поиска в текстовых файлах определенного содержания. Однако часто полезно искать в каталогах имена файлов, а не содержимое файлов, и это можно сделать с помощью grep
и других утилит командной строки Linux.
Использование find вместо grep
Утилита grep
по сути принимает строковые данные из файлов или стандартного ввода и использует шаблоны или регулярные выражения для поиска по ним и вывода соответствующих строк.
Технически вы можете использовать grep
отдельно для поиска имен файлов вместо содержимого, но это только потому, что Linux позволяет использовать подстановочные знаки в имени файла. Однако вы можете так же легко использовать ls
для вывода файлов таким образом или использовать подстановочные знаки в любой другой команде, и это не реальное решение для поиска имен файлов, как grep
ищет контент.
grep "" ./file* -l
Настоящим решением является использование утилиты find
, которая может выполнять поиск в подкаталогах и обеспечивает наиболее надежный способ поиска файлов, поскольку она напрямую взаимодействует с файловой системой. Это наиболее часто используемая утилита для поиска в каталогах, и она имеет множество опций, включая сопоставление с образцом и поддержку регулярных выражений.
Самое простое использование — использовать find
отдельно для вывода списка файлов, включая подкаталоги, и передавать эти данные в grep
. Если у вас уже есть скрипты, использующие grep
, будет довольно легко преобразовать их в соответствие таким образом.
find | grep "file"
Вы также можете использовать шаблоны напрямую с помощью find
, устраняя необходимость в grep
. Используйте -iname
с входными данными.
find . -iname 'file_*.txt'
Однако, в отличие от grep
, команда find
немного более строгая: вам нужно использовать одинарные или двойные кавычки, чтобы экранировать строку поиска, и вам нужно использовать подстановочные знаки, чтобы соответствовать вся строка. Простой поиск подстроки в имени невозможен без использования подстановочных знаков для соответствия остальной части имени.
Использование регулярных выражений (Regex) с find
Вы также можете использовать регулярные выражения с find
, что обеспечивает гораздо более сложное сопоставление:
find . -regex './file.*'
Это регулярное выражение будет соответствовать всем файлам в текущем каталоге, начиная с «file». Однако важно знать, что это работает иначе, чем -iname
; ввод включает полный путь к каталогу и должен использовать ./
, чтобы избежать относительного пути, ./
.
Показанная здесь команда исключает папку ./subdirectory/
, поскольку она не начинается с слова «файл». Чтобы исправить это, вы должны сопоставить все, что ведет к последней косой черте, с .*/
:
find . -regex '.*/file.*'
Регулярные выражения очень сложны, но очень эффективны. Если вы хотите узнать больше, вы можете прочитать наше руководство о том, как они работают.