Скажем, есть файлы с именами:
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.