Рекурсивный поиск файлов в Linux

Обновлено: 21.11.2024

Как я могу рекурсивно найти все файлы в текущей и подпапках на основе сопоставления с подстановочными знаками?

18 ответов 18

find нужна отправная точка, а файл . (точка) указывает на текущий каталог.

Я знаю, что это помечено как linux, но стоит упомянуть: путь требуется для других вариантов * nix, которые не являются linux. В Linux путь необязателен, если вы хотите использовать точку.

@Seatter "foo*" указывает find искать все файлы, начинающиеся с "foo". Это просто его пример. Вы можете использовать «gpio*», чтобы найти все файлы, имена которых начинаются с gpio, или просто «gpio1», чтобы найти все файлы с именем gpio1.

Обратите внимание, что "foo*" заключен в кавычки, поэтому оболочка не раскрывает его перед передачей для поиска. если вы только что нашли. foo* , foo* будет расширен, а ЗАТЕМ передан в find.

Также полезно: если вы не хотите получать уведомления о каталогах, на которые у вас нет разрешения (или о других ошибках), вы можете найти . -name "foo*" 2>/dev/null

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

Например, чтобы найти все файлы со строкой "foo" без учета регистра в имени файла:

find также имеет флаги -iname , -regex и -iregex для нечувствительных к регистру подстановочных знаков, регулярных выражений и совпадений регулярных выражений без учета регистра, поэтому передача в grep не требуется.

Однако конвейерная обработка команды grep -v может позволить вам использовать простые строки или регулярные выражения для удаления ненужных записей.

@iobender - К сожалению, по опыту могу сказать, что не все системы поставляются с командой find, поддерживающей эти параметры. Иногда grep становится единственным вариантом.

find найдет все файлы, соответствующие шаблону:

Надеюсь, это поможет!

В случае, если поиск работает слишком медленно, попробуйте утилиту fd — простую и быструю альтернативу поиску, написанному на Rust.

@aprodan Демонстрационное изображение было скопировано с GitHub, но я полагаю, что они используют asciinema , а затем преобразованы в формат GIF, но я не уверен.

В некоторых случаях мне понадобился параметр -L для обработки символических ссылок на каталоги. По умолчанию символические ссылки игнорируются. В этих случаях это было довольно запутанно, так как я менял каталог на подкаталог и видел файл, соответствующий шаблону, но find не возвращал имя файла. Использование -L решает эту проблему. Параметры символической ссылки для поиска: -P -L -H

Переключатель L очень полезен. Много раз пользователь не имеет никакого представления о базовых каталогах, являются ли они программными ссылками или обычными каталогами. Поэтому в случае сомнений всегда полезно использовать вариант L. По крайней мере, мне это всегда помогало.

Если ваша оболочка поддерживает новый параметр подстановки (можно включить с помощью: shopt -s globstar ), вы можете использовать:

для рекурсивного поиска любых файлов или папок. Это поддерживается Bash 4, zsh и подобными оболочками.

Лично я определил эту функцию оболочки:

Примечание. Строку выше можно вставить непосредственно в оболочку или добавить в пользовательский файл ~/.bashrc.

Затем я могу найти любые файлы, набрав:

В качестве альтернативы вы можете использовать утилиту fd с простым синтаксисом, например. шаблон fd .

@Broncha Потому что вам нужно активировать расширенную подстановку с помощью команды shopt -s globstar. Это поддерживается в Bash, zsh и подобных оболочках.

В соответствии с подстановочными знаками вы можете указать строку, с которой вы хотите сопоставиться, например. *.c (для всех файлов c)

Ваш ответ является первым наиболее правильным здесь, поскольку он ищет только файлы, как указано. Другие, не указывающие тип, вернут каталоги.

Использовать

Пояснение

  1. Первый параметр — это каталог, в котором вы хотите выполнить поиск.
  2. По умолчанию поиск выполняет рекурсию.
  3. -o означает -or. Итак, выше означает поиск этого подстановочного знака ИЛИ этого. Если у вас есть только один шаблон, то нет необходимости в -o .
  4. Обязательно заключайте подстановочный знак в кавычки.

Если вы хотите использовать REGX, используйте -iname

для поиска файлов
find / -xdev -name settings.xml --> весь компьютер
find ./ -xdev -name settings.xml --> текущий каталог и его подкаталог

для файлов с типом расширения

Я удивлен, увидев, что locate не используется интенсивно, когда мы должны идти рекурсивно.

Сначала я бы выполнил локацию "$PWD", чтобы получить список файлов в текущей интересующей папке, а затем запускал бы для них greps, как мне заблагорассудится.

Конечно, предполагается, что updateb выполняется и индекс периодически обновляется. Это гораздо более быстрый способ найти файлы, чем запускать поиск и просить его спуститься по дереву. Упоминание об этом для полноты.Ничего против использования find, если дерево не очень тяжелое.

Способ поиска рекурсивного файла по умолчанию, доступный в большинстве случаев

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

или если справочные страницы недоступны в вашей системе

Однако существуют более современные и более быстрые инструменты, чем find, которые обходят всю вашу файловую систему и индексируют ваши файлы. Одним из таких распространенных инструментов является locate или slocate/mlocate, вы должны проверить руководство своей ОС, чтобы узнать, как его установить, и после того, как он установлен, ему необходимо инициировать базу данных, если скрипт установки не сделает это за вас, это можно сделать вручную, набрав

И использовать его для поиска файлов определенного типа

Или, чтобы найти имя файла или шаблон в текущем каталоге, вы можете ввести:

Он просмотрит свою базу данных файлов и быстро распечатает имена путей, которые соответствуют введенному вами шаблону. Чтобы увидеть полный список опций locate, введите: locate --help или man locate

Кроме того, вы можете настроить locate для обновления базы данных в запланированное время с помощью задания cron, поэтому пример cron, который обновляет базу данных в час ночи, будет выглядеть так:

Эти задания cron должны быть настроены пользователем root, так как updateb нуждается в привилегиях root для обхода всей файловой системы.

Часто задаваемые вопросы о grep Unix/Linux: как выполнить рекурсивный поиск с помощью команды grep в Linux?

Далее показаны два решения, за которыми следуют некоторые дополнительные сведения, которые могут оказаться полезными.

Решение 1. Объедините «find» и «grep»

В течение многих лет я всегда использовал варианты следующих команд Linux find и grep для рекурсивного поиска в подкаталогах файлов, соответствующих шаблону grep:

Эта команда может быть прочитана как «Поиск во всех файлах во всех подкаталогах текущего каталога строки ‘alvin’ и вывод имен файлов, содержащих этот шаблон». Это чрезвычайно мощный подход для рекурсивного поиска файлов во всех подкаталогах, которые соответствуют указанному шаблону.

Решение 2: 'grep -r'

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

Как видите, это гораздо более короткая команда, и она выполняет тот же рекурсивный поиск, что и более длинная команда, а именно:

  • Опция -r говорит "выполнить рекурсивный поиск".
  • Опция -l (буква L в нижнем регистре) означает "отображать только имена файлов".
  • Как вы увидите ниже, вы также можете добавить -i для поиска без учета регистра.

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

Ваш рекурсивный поиск grep не должен ограничиваться только текущим каталогом. В следующем примере показано, как рекурсивно искать в двух несвязанных каталогах строку "alvin" без учета регистра:

В этом примере поиск выполняется без учета регистра путем добавления аргумента -i к команде grep.

Рекурсивное использование egrep

Вы также можете выполнять рекурсивный поиск с помощью команды egrep, которая позволяет искать несколько шаблонов одновременно. Поскольку я обычно помечаю комментарии в своем коде своими инициалами ("aja") или своим именем ("alvin"), эта рекурсивная команда egrep показывает, как искать эти два шаблона, опять же без учета регистра:

Обратите внимание, что в этом случае шаблон поиска необходимо заключать в кавычки.

Сводка: примечания `grep -r`

Несколько замечаний о команде grep -r:

  • Это конкретное использование команды grep не имеет особого смысла, если вы не используете его с аргументом -l (строчная буква "L"). Этот флаг указывает grep напечатать совпадающие имена файлов.
  • Не забудьте указать один или несколько каталогов в конце команды grep. Если вы забудете добавить какие-либо каталоги, grep попытается прочитать из стандартного ввода (как обычно).
  • Как показано, вы также можете использовать другие обычные флаги grep, в том числе -i для игнорирования регистра, -v для изменения значения поиска и т. д.

Вот раздел справочной страницы Linux grep, в котором обсуждается флаг -r:

Как вы видели, команда grep -r упрощает рекурсивный поиск в каталогах всех файлов, соответствующих указанному вами шаблону поиска, а ее синтаксис намного короче, чем у эквивалентной команды find/grep.

Дополнительную информацию о команде find см. в моих примерах команды find для Linux, а дополнительную информацию о команде grep см. в моих примерах команды grep для Linux.

Команда Grep используется для поиска текста в файлах. Это универсальный шаблон, который вызывает grep с параметром –r. Опция –R рекурсивно искать файлы из подкаталогов, начиная с текущего каталога. Команда запускается из каталога верхнего уровня. Например, /home/abc и т. д.Grep — это инструмент для получения зависимостей при переходе с одного хоста на другой. Если мы не укажем каталог в команде, grep будет искать текущий рабочий каталог. Для рекурсивного выполнения grep есть три аргумента, которые мы взяли со страницы руководства grep.

–include используется для точного совпадения в файле, который может быть файлом, присутствующим в каталоге, или по умолчанию. –r подразумевает имя каталога, как описано ранее, если в команде не указан путь, рассматривается текущий каталог. Он следует только по символической ссылке. –R сильно отличается от –r, потому что он читает все файлы, а не только те, которые определены символически.

Синтаксис

«Путь» — это «путь к каталогу». А шаблон — это слово или строка, которую вы хотите найти.

Необходимое условие

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

Все файлы в Linux

Эта команда поможет вам найти все имена файлов в каталогах вашей системы. Так как –l работает только с именами файлов, –r поможет выполнять символический поиск везде, где присутствует требуемое слово, и будет выводиться. Принимая во внимание, что «Акса» — это слово, которое мы хотим найти. Эта команда не указывает путь к каталогу, потому что здесь нам нужны все возможные имена файлов в системе. Если мы указали путь, процесс поиска будет иметь ограничения.

Простой пример

Чтобы понять дилемму рекурсивности с помощью пути, мы представили простой пример, который поможет пользователю. Как показано в приведенной ниже команде, «универсальный» — это слово, которое мы хотим найти. После слова идет каталог, в котором мы хотим выполнить сортировку. Он показывает как имя файла с каталогом, так и весь текст внутри файла. –r также показывает двоичные файлы.

Рекурсивный поиск во всех каталогах и подкаталогах

Поскольку мы все знакомы с функциональностью «*» в поисковой системе. Это подразумевает сортировку во всех файлах. Таким образом, команда отобразит соответствующие данные из всех файлов. Слово «дом» следует искать рекурсивно с помощью оператора grep.

Он показывает имена файлов и текст внутри, выделяя искомое слово, указывая на наличие совпадения. Только один текстовый файл содержал это слово, которое отображается в результирующей строке.

Рекурсивный поиск строки

В отличие от приведенных выше примеров, grep работает со строкой в ​​определенном каталоге. /etc/ — это командный каталог, что означает, что поиск будет осуществляться через этот каталог, IP-адрес компьютера. Его информация сохраняется в каталоге, имена файлов которого находятся в каталоге /etc/ppp/. Параметр — это имя конкретной папки. Эта команда прочитает все файлы в указанном каталоге.

Имена файлов в выводе могут быть скрыты с помощью параметра –h. Команда выглядит следующим образом.

Оба разделителя могут быть записаны как -h -R в команде.

Рекурсивный поиск без каталога

Рекурсивный поиск также можно выполнять без использования каталога, просто ища слово по одному слову.

Слово «жена» автоматически ищется во всех каталогах, потому что, когда каталог не упоминается, процесс поиска будет продолжаться во всех файлах и каталогах системы. Он также будет включать двоичные файлы вместе с текстовыми файлами. Сначала отображаются адрес и имена файлов. В то время как текст внутри файла отображается. Отображается не только обычный текст, но и команда grep, примененная к тексту файла, т. е. grep «Я домохозяйка».

Grep Exact Multiple Patterns

Поиск по нескольким методам также можно получить с помощью команды grep. «-rw» используется для изучения конкретного совпадения. «-e» используется для добавления в команду более одного шаблона. Путь к каталогу упоминается для удобства поиска системой. Двоичные файлы исключаются, потому что введено ограничение на добавление каталога в команду. Вывод содержит имя каталога файла и имя файла. Также отображается текст внутри файла.

Искомые слова выделяются в тексте файла. Оба искомых термина должны присутствовать в одном файле. Существует вероятность существования слов в разных файлах, как показано в выводе.

Рекурсивное использование Grep – -Include

“—include” соответствует заданному шаблону файла и работает эффективно, так как также ускоряет процесс поиска, который работает с большинством файлов. Здесь он не приносит двоичные или скомпилированные файлы или файлы изображений. Расширение файла используется для добавления ограничений к команде. Каталог упоминается для получения требуемого вывода. Включенное ключевое слово довольно продвинуто в grep по сравнению с другими функциями.

Заключение

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

Об авторе

Акса Ясин

Я целеустремленный профессионал в области информационных технологий и обожаю писать. Я технический писатель и люблю писать для всех разновидностей Linux и Windows.

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

Большую часть времени мы используем команду grep для поиска строки в текстовом файле. Но что, если вы хотите найти строку во всех файлах каталога?

Чтобы рекурсивно собрать все файлы в каталоге, нам нужно использовать параметр -R.

grep -R строка /каталог

При использовании опции -R команда Linux grep будет искать указанную строку в указанном каталоге и подкаталогах внутри этого каталога.

Если имя папки не указано, команда grep будет искать строку в текущем рабочем каталоге.

ошибка grep -R /var/log/

В приведенном выше примере команда Linux grep будет искать строку «ошибка» внутри папки /var/log/ и подпапок папки /var/log/.

Рекурсивный поиск без учета регистра

Опцию -R можно комбинировать с опцией -i, чтобы сделать поиск grep нечувствительным к регистру.

grep -Ri ошибка /var/log/

Приведенная выше команда рекурсивно выполнит поиск всех файлов в каталоге /var/log/, но на этот раз команда grep проигнорирует регистр.

Возвращать имя файла только в рекурсивном поиске grep

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

grep -R -l ошибка /var/log

В приведенном выше примере мы использовали параметр -l в рекурсивном поиске grep. Команда grep выполнит поиск строки «ошибка» и вернет файлы, содержащие строку «ошибка».

Исключить каталоги из рекурсивного поиска grep

Опция –exclude-dir используется для исключения папок из поиска при рекурсивном поиске файлов в каталоге.

grep -R -l --exclude-dir=ошибка журнала /var/log/

Как и в приведенном выше примере, команда grep исключит журнал папки из рекурсивного поиска.

Файлы без совпадений — обратный рекурсивный поиск в grep

Еще одна полезная опция, когда grep All Files in a Directory возвращает все файлы, которые не соответствуют заданному текстовому шаблону.

Это делается с помощью параметра -L или --files-without-match в рекурсивном поиске grep.

grep -R -L ошибка /var/log/

Как и в приведенном выше примере, команда grep вернет все файлы в папке /var/log/, которые не содержат текст «ошибка».

Вот как мы можем рекурсивно просмотреть все файлы в папке в операционной системе Linux.

Резюме — рекурсивный поиск Linux grep

В этом руководстве мы узнали, как рекурсивно выполнить поиск всех файлов в каталоге в операционной системе Linux с помощью команды grep.

Читайте также: