Как найти файл из любого каталога

Как найти файл из любого каталога

Я пытаюсь найти файл под названиемКнига1.

В своем тесте я пытаюсь найти вышеупомянутый файл, но в этом тесте я не знаю, где он находится.

Я попробовал find / -iname book1, но результата нет.

Как найти файл book1 с помощью командной строки, если я не знаю, где он находится?

РЕДАКТИРОВАТЬ:

Мой сценарий более подробно описан ниже:

  1. Расширение файла неизвестно.
  2. Точное название (т.е. заглавные буквы, цифры и т.д.) неизвестно.
  3. Местоположение файла неизвестно.

решение1

Во-первых, аргумент -iname— это оболочкашаблон. Подробнее о шаблонах можно прочитать вРуководство по Башу. Суть в том, что для того, чтобы findна самом деленаходитьфайл имя файла должно соответствовать указанному шаблону. Чтобы сделать строку без учета регистра, book1вам Book1.gnumericнужно либо добавить, *чтобы это выглядело так:

find / -iname 'book1*'

или укажите полное имя:

find / -iname 'Book1.gnumeric'

Во-вторых, -inameбудет findигнорироваться регистр имени файла, поэтому если вы укажете , -iname book1он также может найти Book1и bOok1т. д. Если вы уверены, что файл, который вы ищете, называется , Book1.gnumeric то не используйте -inamebut -name, это будет быстрее:

find / -name 'Book1.gnumeric'

В-третьих, помните о цитировании шаблона, как сказано вдругой ответ.

И последнее - вы уверены, что хотите найти файл повсюдув вашей системе? Возможно, файл, который вы ищете, на самом деле находится в вашем $HOMEкаталоге, если вы работали над ним или скачали его откуда-то. Опять же, это может быть намного быстрее.

РЕДАКТИРОВАТЬ:

Я заметил, что вы отредактировали свой вопрос. Если вы действительно не знаете полное имя файла, регистр и местоположение, вам следует использовать что-то вроде этого:

find / -iname 'book1*'

Я также предлагаю добавить 2>/dev/nullв конец строки, чтобы скрыть все *permission denied*и другие ошибки, которые будут присутствовать, если вы вызовете команду findкак не-root пользователь:

find / -iname 'book1*' 2>/dev/null

А если вы уверены, что ищете один файл, и в вашей системе есть только один файл, соответствующий критериям, вы можете findвыйти после нахождения первого соответствующего файла:

find / -iname 'book1*' -print -quit 2>/dev/null

решение2

Вы можете попробовать locateкоманду. Она использует базу данных имен файлов, чтобы ускорить поиск.

Для поиска всех соответствующих файлов *book1*, игнорируя регистр, можно использовать

locate -i book1

если вы хотите искать файлыначинаявам book1нужно будет сделать подстановочный знак самостоятельно:

locate -i 'book1*'

Он намного быстрее, чем find, но его актуальность определяется последним обновлением базы данных.

решение3

Если вы знаете, что у вас есть файл с именем book1.something, местоположение которого, точное значение somethingи шаблон использования заглавных букв в имени файла неизвестны:

find / -iname 'book1.*'

Если вы точно знаете только то, что имя файла содержит слово book, вы можете сгенерировать, вероятно, гораздо больший список с помощью

find / -iname '*book*'

Аргумент — -nameэто шаблон shell glob. Из каталога, в котором находится файл, сравните:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

Это представляет собой тип поиска, выполняемого -name. -inameОпция просто допускает версию этого без учета регистра.

решение4

С Zsh вы можете использовать шаблоны glob, так что это тоже работает:

ls -a /**/book1

Это позволит найти все места, где находится файл с именем book1.

В моем тестировании это оказалось быстрее, чем использованиеfind , и также не производит практически никаких результатовошибки прав пользователяпри запуске без прав root

Видетьруководство.

Связанный контент