
Я пытаюсь найти файл под названиемКнига1.
В своем тесте я пытаюсь найти вышеупомянутый файл, но в этом тесте я не знаю, где он находится.
Я попробовал find / -iname book1
, но результата нет.
Как найти файл book1 с помощью командной строки, если я не знаю, где он находится?
РЕДАКТИРОВАТЬ:
Мой сценарий более подробно описан ниже:
- Расширение файла неизвестно.
- Точное название (т.е. заглавные буквы, цифры и т.д.) неизвестно.
- Местоположение файла неизвестно.
решение1
Во-первых, аргумент -iname
— это оболочкашаблон. Подробнее о шаблонах можно прочитать вРуководство по Башу. Суть в том, что для того, чтобы find
на самом деленаходитьфайл имя файла должно соответствовать указанному шаблону. Чтобы сделать строку без учета регистра, book1
вам Book1.gnumeric
нужно либо добавить, *
чтобы это выглядело так:
find / -iname 'book1*'
или укажите полное имя:
find / -iname 'Book1.gnumeric'
Во-вторых, -iname
будет find
игнорироваться регистр имени файла, поэтому если вы укажете , -iname book1
он также может найти Book1
и bOok1
т. д. Если вы уверены, что файл, который вы ищете, называется , Book1.gnumeric
то не используйте -iname
but -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
Видетьруководство.