Библиотека сайта rus-linux.net
Как найти все файлы с заданным текстом с помощью командной оболочки Linux
Оригинал: How to find all files with a specific text using Linux shell
Автор: Lubos Rendek
Дата публикации: 30 ноября 2017 года
Перевод: А. Кривошей
Дата перевода: август 2018 г.
В этой статье приведены некоторые полезные советы о том, как найти все файлы в любом конкретном каталоге или во всей файловой системе, содержащие любое заданное слово или строку.
Условные обозначения
# - требует, чтобы данная команда выполнялась с привилегиями root либо непосредственно пользователем root, либо с помощью команды sudo.
$ - данная команда должна выполняться обычным непривилегированным пользователем.
Примеры
Нерекурсивный поиск всех файлов с определенной строкой.
Первый пример команды будет искать строку "stretch" во всех файлах в каталоге /etc/, исключая любые подкаталоги:
# grep -s stretch /etc/* /etc/os-release:PRETTY_NAME="Debian GNU/Linux 9 (stretch)" /etc/os-release:VERSION="9 (stretch)"
Параметр -s будет подавлять сообщения об ошибках о несуществующих или нечитаемых файлах. На выходе отображаются имена файлов, а также выводится строка с запрошенным текстом.
Рекурсивный поиск всех файлов с определенной строкой.
Вышеприведенная команда пропускает все подкаталоги. Рекурсивный поиск означает перемещение по всем подкаталогам. Следующая команда будет искать строку "stretch" во всех файлах в каталоге /etc/, включая все подкаталоги:
Поиск всех файлов, содержащих определенное слово
В приведенном выше примере команды grep перечислены все файлы, содержащие строку stretch. Также показаны строки с stretches, stretched и т. д. Параметр -w grep используется для отображения только определенного слова:
Вывод только имен файлов, содержащих определенный текст
Вышеприведенные команды могут давать избыточный вывод. В следующем примере будут отображаться только имена файлов в каталоге /etc/ рекурсивно, содержащих строку "stretch":
# grep -Rl stretch /etc/* /etc/apt/sources.list /etc/dictionaries-common/words /etc/grub.d/00_header /etc/os-release
Поиск без учета регистра
Все поисковые запросы по умолчанию чувствительны к регистру, то есть любой поиск строки "stretch" отображает только файлы, содержащие точные совпадения в верхнем и нижнем регистре. С помощью опции -i команда также будет выводить любые строки, содержащие Stretch, STRETCH, StReTcH и т. д.
# grep -Ril stretch /etc/* /etc/apt/sources.list /etc/dictionaries-common/default.hash /etc/dictionaries-common/words /etc/grub.d/00_header /etc/os-release
Включение или исключение из поиска заданных имен файлов
С помощью команды grep также можно включать в поиск только определенные файлы. Например, мы хотели бы искать конкретный текст/строку только в конфигурационных файлах с расширением .conf. В следующем примере будут найдены все файлы с расширением .conf в каталоге /etc, содержащие строку bash:
# grep -Ril bash /etc/*.conf
или
# grep -Ril --include=\*.conf bash /etc/* /etc/adduser.conf
Аналогично, используя опцию --exclude, можно исключать любые заданные имена файлов:
# grep -Ril --exclude=\*.conf bash /etc/* /etc/alternatives/view /etc/alternatives/vim /etc/alternatives/vi /etc/alternatives/vimdiff /etc/alternatives/rvim /etc/alternatives/ex /etc/alternatives/rview /etc/bash.bashrc /etc/bash_completion.d/grub /etc/cron.daily/apt-compat /etc/cron.daily/exim4-base /etc/dictionaries-common/default.hash /etc/dictionaries-common/words /etc/inputrc /etc/passwd /etc/passwd- /etc/profile /etc/shells /etc/skel/.profile /etc/skel/.bashrc /etc/skel/.bash_logout
Исключение из поиска заданных директорий
Как и файлы, мы можем исключать из поиска заданные директории. Для этого используется опция --exclude-dir. В приведенном ниже примере мы ищем все файлы в директории /etc, содержащие строку stretch, исключая директорию /etc/grub.d
# grep --exclude-dir=/etc/grub.d -Rwl stretch /etc/* /etc/apt/sources.list /etc/dictionaries-common/words /etc/os-release
Вывод номера строки, содержащей заданную строку
Используя опцию -n, мы можем получать информацию о номере строки, содержащей заданную строку:
# grep -Rni bash /etc/*.conf /etc/adduser.conf:6:DSHELL=/bin/bash
Поиск всех файлов, не содержащих заданную строку
В последнем примере мы используем опцию -v, чтобы вывести список всех файлов, не содержащих заданное ключевое слово:
# grep -Rlv stretch /etc/*
По приведенным ниже ссылкам вы найдете дополнительные материалы о поиске файлов в консоли Linux:
- 14 примеров практического использования команды find в Linux
- Как найти недавно модифицированные файлы в Linux
- Поиск текста в PDF-документах из командной строки с помощью pdfgrep
- Обзор утилит GNU для обработки текста. Часть 1А: Основы
- 8 примеров использования команды locate в Linux