Наши партнеры

UnixForum





Библиотека сайта 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: