Команда для поиска файлов путем поиска только часть их имен?

32

Скажем, есть файлы с именами:

batman.c
debate.c
cricketbat.c

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

srk_cb
источник
5
Вы хотите перечислить соответствующие файлы только в текущем каталоге? в любом каталоге в или ниже текущего каталога? где-нибудь в системе?
SteelDriver

Ответы:

47

Поиск файлов в batлюбом месте

Чтобы найти все файлы внутри, /path/to/folderчьи имена содержат bat, вы можете использовать:

find /path/to/folder -name '*bat*'

Я цитировал шаблон поиска , *bat*потому что, если котировки были опущены и файлы совпадают *bat*в текущем каталоге, то оболочка будет расширяться *bat*в их список и передать , что к find. Тогда findне будет работать правильно. ( \*bat\*а "*bat*"также работа.)

Для поиска в папке, в которой вы находитесь (например, в которой вы редактировали cd), используйте ., как обычно:

find . -name '*bat*'

Для поиска по всему компьютеру используйте/ . Для поиска в вашем домашнем каталоге используйте ~или полное имя вашего домашнего каталога. ( Оболочка расширяется~ до полного пути вашего домашнего каталога.)

Расширение или сужение поиска по имени

Если вы хотите найти регистронезависимо, поэтому файлы , содержащие BAT, bAtи так далее подбираются, используйте -inameтест вместо -nameтеста:

find /path/to/folder -iname '*bat*'

Я заметил, что все ваши файлы заканчиваются .c. Если вы хотите найти только такие файлы, используйте:

find /path/to/folder -name '*bat*.c'

Я заметил, что все ваши имена файлов имеют batлибо в самом начале, либо в самом конце части, предшествующей .cсуффиксу. Если вы хотите избежать совпадения файлов, например embattled.c, вы можете использовать:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oэто оператор или .

Соответствие только файлам

Вы можете использовать только обычные файлы, а не папки, символические ссылки и специальные узлы устройств -type f. Это часто рекомендуется, а иногда и вполне уместно ... но часто это не то, что вам действительно нужно , особенно если вы работаете findс целью самостоятельно проверить результаты. Если бы у вас была символическая ссылка, которая соответствовала вашему запросу, разве вы не хотели бы знать об этом?

Если вы хотите найти как обычные файлы, так и символические ссылки, вы можете использовать:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

При этом -oдля группировки используется оператор, а также скобки (которые должны быть заключены в кавычки, чтобы оболочка не обращалась с ними особо; в противном случае вы получите синтаксическую ошибку).

Но предположим, что вы хотите видеть только символические ссылки, которые в конечном итоге указывают на обычный файл (а не символические ссылки на каталоги, узлы устройств и т. Д.). Это на самом деле еще проще: использовать -xtypeвместо -type. При условии, что вы не запускаете findс -Lфлагом, -xtypeна символической ссылке проверяется тип файла, на который указывает ссылка.

find /path/to/folder -name '*bat*' -xtype f

Если у вас есть символическая ссылка на другую символическую ссылку на файл, она -xtype fбудет соответствовать ей, даже если ее прямой целью является другая символическая ссылка, а не обычный файл. Это почти всегда то, что вы хотите.

Часто люди думают, что хотят -type f, но на самом деле они хотят -xtype f.

Получение подробного вывода

findдействие по умолчанию, если вы не указали его -print. Все команды, приведенные выше, эквивалентны самим себе с -printприкрепленным в конце.

findчасто используется для запуска команд на основе найденных файлов - часто это команды, которые вносят изменения. Но есть и другие действия, целью которых, кроме всего прочего, является отображение результатов -print. Особый интерес представляет -ls:

find /path/to/folder -name '*bat*' -ls

Это дает подробную информацию о каждом файле в многостолбцовом формате, аналогично (хотя и не совсем такому) тому, что вы увидите при запуске .ls file

Дальнейшее чтение

Для получения дополнительной информации findи других способов поиска файлов см .:

Элия ​​Каган
источник
1
Отличный ответ, особенно -xtypeсовет; возможно ls *bat*и -maxdepth/ mindepthтакже стоит упомянуть.
mklement0
2
@ mklement0 Спасибо! ОП еще не предоставил разъяснения о том, где находятся файлы и нужна ли рекурсия. В ответ Хаоса охвачены lsуже, я сосредоточился на рекурсивном случае с findздесь. Конечно, также был бы полезен подробный ответ, охватывающий не (или менее) -рекурсивный список имен файлов, соответствующих некоторому шаблону ( lsи findс -maxdepth). Возможно, вы захотите опубликовать такой ответ!
Элия ​​Каган
16

Самый простой способ - бежать

locate bat

Таким образом, вы можете искать на всем компьютере файлы, содержащие «bat» в имени файла.

Чтобы обновить список файлов на вашем компьютере, запустите

updatedb

Запустите эту команду, если вы недавно добавили новые файлы в свою учетную запись

Марк Кирби
источник
1
нуждыupdatetdb
Сергей Колодяжный
4
@Serg Чтобы найти новые файлы (более новые, чем в прошлый раз, когда последний раз updatedbвыполнялись вручную или автоматически), sudo updatedbсначала нужно будет запустить их, да.
Элия ​​Каган,
Обратите внимание, что это будет искать всю систему для соответствия имен bat.
тердон
1
@terdon Я уже говорил об этом в ответе, не думаю, что это заслуживает отрицательного голосования, когда я уже сказал это.
Марк Кирби
1
Обратите внимание, что это НАМНОГО быстрее, чем find /при locateпоиске в базе данных, в то время как findрекурсивно перечисляет, /а затем соответствует регулярному выражению.
Тимоти Гу
14

Откройте терминал и измените каталоги на каталог, откуда вы хотите начать поиск, а затем выполните эту команду:

find . -name "*bat*" -type f 

.Начинает команды поиска из текущего каталога.
Соответствует -nameстроке batи чувствителен к регистру. ( -inameЧувствителен к регистру)
В -type fпоиск файлов только.

Карел
источник
удалить и восстановить? хорошо +1: P;)
AB
6

Если файлы находятся в текущем каталоге, используйте:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

Или (чтобы они были построчно):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

Если вы хотите найти в системе эти файлы, используйте:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c
хаос
источник
1
Если ваш поиск начинается с корневого каталога, вы можете добавить sudo, так как эта команда сообщит «Отказано в доступе» для некоторых папок
Сергей Колодяжный
4

Вы хотите использовать findкоманду с -inameопцией сопоставления имен файлов без учета регистра или -nameопцией сопоставления имен файлов с учетом регистра. Оба из них позволят вам использовать подстановочные имена. Итак, чтобы найти любые имена файлов, которые содержат «bat», вы должны использовать:

find / -iname '*bat*'

Или

find / -name '*bat*'

В *означает «любой символ (ы)», поэтому поиск ищет batс любыми символами, не включая ни одного, до или после него. В /поиск из корневого каталога рекурсивно, вы можете использовать , .который будет искать рекурсивно из текущего каталога или абсолютный путь для того, где вы хотите , чтобы найти. Посмотрите, как искать файлы с помощью регулярных выражений в сценарии оболочки Linux.

AJefferiss
источник
@EliahKagan спасибо, я добавил еще немного информации в свой ответ.
AJefferiss
+1 Спасибо за редактирование. IMO - сила этого ответа в том, что он избегает рекомендовать неизбирательное использование -type f, которое делает больше, чем просто исключает каталоги, и зачастую это не то, что пользователи действительно хотят .
Элия ​​Каган,
2

Используйте старый добрый find.

find <path_for_search> -type f -iname "*bat*" 

например.:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

от man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
AB
источник