Скажем, есть файлы с именами:
batman.c
debate.c
cricketbat.c
Какую команду и как я должен использовать ее, чтобы перечислить все эти файлы с помощью тега поиска bat
?
Скажем, есть файлы с именами:
batman.c
debate.c
cricketbat.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 file
Для получения дополнительной информации find
и других способов поиска файлов см .:
find
справочника , доступная онлайн или man find
через терминал.find
, locate
и xargs
коммунальные услуги.-xtype
совет; возможно ls *bat*
и -maxdepth
/ mindepth
также стоит упомянуть.
ls
уже, я сосредоточился на рекурсивном случае с find
здесь. Конечно, также был бы полезен подробный ответ, охватывающий не (или менее) -рекурсивный список имен файлов, соответствующих некоторому шаблону ( ls
и find
с -maxdepth
). Возможно, вы захотите опубликовать такой ответ!
Самый простой способ - бежать
locate bat
Таким образом, вы можете искать на всем компьютере файлы, содержащие «bat» в имени файла.
Чтобы обновить список файлов на вашем компьютере, запустите
updatedb
Запустите эту команду, если вы недавно добавили новые файлы в свою учетную запись
updatetdb
updatedb
выполнялись вручную или автоматически), sudo updatedb
сначала нужно будет запустить их, да.
bat
.
find /
при locate
поиске в базе данных, в то время как find
рекурсивно перечисляет, /
а затем соответствует регулярному выражению.
Откройте терминал и измените каталоги на каталог, откуда вы хотите начать поиск, а затем выполните эту команду:
find . -name "*bat*" -type f
.
Начинает команды поиска из текущего каталога.
Соответствует -name
строке bat
и чувствителен к регистру. ( -iname
Чувствителен к регистру)
В -type f
поиск файлов только.
Если файлы находятся в текущем каталоге, используйте:
$ 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
Вы хотите использовать find
команду с -iname
опцией сопоставления имен файлов без учета регистра или -name
опцией сопоставления имен файлов с учетом регистра. Оба из них позволят вам использовать подстановочные имена. Итак, чтобы найти любые имена файлов, которые содержат «bat», вы должны использовать:
find / -iname '*bat*'
Или
find / -name '*bat*'
В *
означает «любой символ (ы)», поэтому поиск ищет bat
с любыми символами, не включая ни одного, до или после него. В /
поиск из корневого каталога рекурсивно, вы можете использовать , .
который будет искать рекурсивно из текущего каталога или абсолютный путь для того, где вы хотите , чтобы найти. Посмотрите, как искать файлы с помощью регулярных выражений в сценарии оболочки Linux.
-type f
, которое делает больше, чем просто исключает каталоги, и зачастую это не то, что пользователи действительно хотят .
Используйте старый добрый 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.