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

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

batman.cdebate.ccricketbat.c

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

Поиск файлов с помощью 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 файл.

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

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

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

locate bat

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

Чтобы обновить список файлов на вашем КОМПЬЮТЕРЕ, запустите

updatedb

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

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

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

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

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

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

Или (чтобы иметь их построчно):

$ ls -1 *bat*batgirl.cbatman.cbatwoman.ccricketbat.c

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

$ find / -name "*bat*"/path/to/cricketbat.c/path/to/batgirl.c/path/to/batwoman.c/path/to/batman.c

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

find / -iname '*bat*'

Или

find / -name '*bat*'

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

Используйте старый добрый 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.

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