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

Как показать только имена файлов с помощью grep в Linux


grep – это утилита Linux для поиска текстовых файлов. По умолчанию он распечатывает результаты поиска, но его также можно использовать для сопоставления и печати имен файлов, содержащих результат поиска, что может быть полезно при соединении с другими скриптами.

Использование grep для печати имен файлов

grep обычно используется вместе с другими командами в сценариях bash в качестве обычной утилиты для поиска текста. Однако по умолчанию он ничего не печатает об именах файлов, которые могут вам понадобиться, если вы передаете вывод другой утилите.

Если вам нужен список совпадающих файлов, вы можете использовать grep с флагом -l , который будет отображать имена файлов вместо соответствовать:

grep -l foo ./*

Это похоже на флаг -H , который выводит ответ, содержащий имя файла, за которым следует совпадающая строка. Однако при использовании -l будет напечатано только имя файла, что даст вам список файлов, содержащих строку поиска.

Вы также можете использовать флажок -L в верхнем регистре, чтобы сделать обратное: распечатать все файлы, не содержащие совпадающую строку.

grep -L baz ./*

Обрезка пути к файлу

По умолчанию флаг -l будет печатать файлы с предварительно добавленным относительным путем к файлу. Если вам нужно только фактическое имя файла, вы можете обрезать путь к файлу с помощью утилиты basename . Это потребует передачи ввода через xargs, но работает довольно хорошо:

grep -l foo ./* | xargs -L 1 basename

Имейте в виду, что grep -r выполняет рекурсивный поиск, и если вы используете его с basename, ответ может содержать файлы с обрезанными путями, которые не входят в текущий напрямую.

Использование grep с командой find

grep также хорошо работает с дополнительной утилитой поиска команды find . Например, вы можете использовать его с командой find для поиска каждого текстового файла в каталоге и легко запустить поиск grep :

find . -iname "*txt" -exec grep foo {} ;

Или используйте его с флагом -l, чтобы получить список имен файлов:

find . -iname "*txt" -exec grep -lH foo {} ;