Как я могу рекурсивно найти все файлы в текущей и вложенных папках на основе сопоставления по шаблону? - PullRequest
1559 голосов
/ 06 мая 2011

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

Ответы [ 14 ]

2283 голосов
/ 06 мая 2011

Используйте find для этого:

find . -name "foo*"

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

196 голосов
/ 15 августа 2012

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

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

~$ find . -print | grep -i foo
126 голосов
/ 06 мая 2011

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

find . -name "*foo"

Однако, если вам нужна картинка:

tree -P "*foo"

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

26 голосов
/ 14 января 2017
find -L . -name "foo*"

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

23 голосов
/ 13 января 2017

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

echo **/*foo*

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


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

f() { find . -name "*$1*"; }

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

Тогда я могу искать любые файлы, набрав:

f some_name

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

22 голосов
/ 05 февраля 2017
find <directory_path>  -type f -name "<wildcard-match>"

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

18 голосов
/ 13 июня 2018

fd

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

Синтаксис:

fd PATTERN

Демо-версия:

Домашняя страница: https://github.com/sharkdp/fd

10 голосов
/ 29 октября 2017

Вы можете использовать:

# find . -type f  -name 'text_for_search'

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

# find . -type f  -iname 'text_for_search'
6 голосов
/ 09 августа 2017

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

find . -name "filepattern"

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

man find

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

find --help

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

sudo updatedb

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

locate filename

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

 pwd | xargs -n 1 -I {} locate "filepattern"

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

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

0 1 * * * updatedb

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

5 голосов
/ 31 мая 2017

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

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

find . -type f -name "*.iso"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...