В этой статье приведены некоторые полезные советы о том, как найти все файлы в любом конкретном каталоге или во всей файловой системе, содержащие любое заданное слово или строку.
Условные обозначения
# - требует, чтобы данная команда выполнялась с привилегиями 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 -R stretch /etc/* /etc/apt/sources.list:# deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main /etc/apt/sources.list:#deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main /etc/apt/sources.list:deb http://ftp.au.debian.org/debian/ stretch main /etc/apt/sources.list:deb-src http://ftp.au.debian.org/debian/ stretch main /etc/apt/sources.list:deb http://security.debian.org/debian-security stretch/updates main /etc/apt/sources.list:deb-src http://security.debian.org/debian-security stretch/updates main /etc/dictionaries-common/words:backstretch /etc/dictionaries-common/words:backstretch's /etc/dictionaries-common/words:backstretches /etc/dictionaries-common/words:homestretch /etc/dictionaries-common/words:homestretch's /etc/dictionaries-common/words:homestretches /etc/dictionaries-common/words:outstretch /etc/dictionaries-common/words:outstretched /etc/dictionaries-common/words:outstretches /etc/dictionaries-common/words:outstretching /etc/dictionaries-common/words:stretch /etc/dictionaries-common/words:stretch's /etc/dictionaries-common/words:stretched /etc/dictionaries-common/words:stretcher /etc/dictionaries-common/words:stretcher's /etc/dictionaries-common/words:stretchers /etc/dictionaries-common/words:stretches /etc/dictionaries-common/words:stretchier /etc/dictionaries-common/words:stretchiest /etc/dictionaries-common/words:stretching /etc/dictionaries-common/words:stretchy /etc/grub.d/00_header:background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"` /etc/os-release:PRETTY_NAME="Debian GNU/Linux 9 (stretch)" /etc/os-release:VERSION="9 (stretch)"
Поиск всех файлов, содержащих определенное слово
В приведенном выше примере команды grep перечислены все файлы, содержащие строку stretch. Также показаны строки с stretches, stretched и т. д. Параметр -w grep используется для отображения только определенного слова:
# grep -Rw stretch /etc/* /etc/apt/sources.list:# deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main /etc/apt/sources.list:#deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main /etc/apt/sources.list:deb http://ftp.au.debian.org/debian/ stretch main /etc/apt/sources.list:deb-src http://ftp.au.debian.org/debian/ stretch main /etc/apt/sources.list:deb http://security.debian.org/debian-security stretch/updates main /etc/apt/sources.list:deb-src http://security.debian.org/debian-security stretch/updates main /etc/dictionaries-common/words:stretch /etc/dictionaries-common/words:stretch's /etc/grub.d/00_header:background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"` /etc/os-release:PRETTY_NAME="Debian GNU/Linux 9 (stretch)" /etc/os-release:VERSION="9 (stretch)"
Вывод только имен файлов, содержащих определенный текст
Вышеприведенные команды могут давать избыточный вывод. В следующем примере будут отображаться только имена файлов в каталоге /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 OR # 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/*
ASD
ОтветитьУдалить