Поиск по сайту:

Как 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.*'

Регулярные выражения очень сложны, но очень эффективны. Если вы хотите узнать больше, вы можете прочитать наше руководство о том, как они работают.