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

23

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

batman.c
debate.c
cricketbat.c

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

    
задан srk_cb 08.05.2015 в 12:44
источник

6 ответов

35

Поиск файлов с bat Anywhere

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

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

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

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

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 будет соответствовать ей, даже если ее цель direct является другой символической ссылкой, а не обычным файлом. Это почти всегда то, что вы хотите.

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

Получение детального результата

%. Действие co_de% по умолчанию, если вы не укажете, что оно find . Все приведенные выше команды эквивалентны тому, что -print нажимается в конце.

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

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

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

Дополнительная литература

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

ответ дан Eliah Kagan 08.05.2015 в 13:43
источник
16

Самый простой способ - запустить

locate bat

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

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

updatedb

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

    
ответ дан Mark Kirby 08.05.2015 в 12:49
14

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

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

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

    
ответ дан karel 08.05.2015 в 12:46
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
    
ответ дан chaos 08.05.2015 в 13:00
4

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

find / -iname '*bat*'

или

find / -name '*bat*'

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

    
ответ дан AJefferiss 08.05.2015 в 12:46
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.
    
ответ дан A.B. 08.05.2015 в 13:09