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


22

Я пытаюсь найти файл с именем Book1 .

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

Я пытался, find / -iname book1но нет выхода.

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

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

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

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

2
Если существует файл с именем Book1, и он находится в каталоге, который вы можете прочитать, то find / -iname book1найдете его. Вы уверены, что это на самом деле Book1, а нет Book1.xyz?
Фокс

Полное имя файла - Book1.gnumeric. Вы говорите, что я должен указать полное имя файла? По какой-то причине я подумал, для этой конкретной команды, что все, что мне нужно, это общее имя файла. Мой тест пытается найти файл, если, например, я не помню расширение файла и знаю только имя файла, который я ищу. Пожалуйста, порекомендуйте.
Aspire27

@don_crissti Готово. Пожалуйста, смотрите выше Редактировать.
Aspire27

Вы смешиваете find и locate. locateявляется щедрым и найдет все, что соответствует, если оно находится в его базе данных, которая обычно обновляется ежедневно. findв данном случае ищет файловый глобус, тип шаблона, который вы использовали бы в ls. Вы, наверное, имеете в виду iname '*book1*'. Обратите внимание, что шаблон должен быть внутри кавычек, чтобы оболочка не раскрыла его до того, как findувидит его. Также обратите внимание, что find, как и многие команды * nix, разочаровывающе тихо, когда это не удается.
Manngo

Ответы:


31

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

find / -iname 'book1*'

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

find / -iname 'Book1.gnumeric'

Во-вторых, -inameзаставит findигнорировать регистр имени файла, поэтому, если вы укажете, -iname book1он также может найти Book1и bOok1т. Д. Если вы уверены, что файл, который вы ищете, вызывается Book1.gnumeric , не используйте, -inameно -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


6

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

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

locate -i book1

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

locate -i 'book1*'

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


5

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

find / -iname 'book1.*'

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

find / -iname '*book*'

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

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

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


1

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

Сообщит путь всех файлов, имя которых содержит book1(с любой вариации случая, но учитывая только ASCII латинские символы bokBOK, а не много других вариантов в Unicode , как 𝗄, 𝚔, 𝘬, , , , и все их вариации с диакритиками ...) в все каталоги, к которым у вас есть доступ для чтения.


0

Для таких задач я всегда делаю: find / -iregex '.*Book1.*'

Эта форма будет заботиться о 3 пунктах вашего сценария ( iregexэто рациональное выражение без .*учета регистра, и шаблон с обеих сторон будет соответствовать любому символу до и после вашего фиксированного шаблона Book1 - это, очевидно, может дать вам больше результатов, чем необходимо но вы точно не пропустите файл)

Основное отличие: если возможно, будьте более строгими, чем просто используя /, например, пытаясь только /homeили около того, в противном случае вы попадете в не нужные каталоги ( /sys, /devи т. Д.)

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


iregex не будет работать в таких местах, как Solaris (ОС не была указана) (и, возможно, * BSD), это расширение GNU и не является частью стандартаfind
Герт ван ден Берг

0

Silver Searcher - это очень быстрый и удобный инструмент для поиска файлов и контента.

Чтобы решить вашу проблему, команда поиска серебра должна выглядеть следующим образом ...

ag -g Book1

-g PATTERN Распечатать имена файлов, соответствующие PATTERN


0

locate и его варианты, как правило, быстрый метод.

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

Если поиск не доступен, вы можете использовать findвместо этого. Это имеет тенденцию быть намного медленнее, но также и намного более точным.

Если у вас один раздел: (запустите от имени пользователя root, если у вашего пользователя нет доступа к файлу)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

Если вы не включили -xdev findпоиск в других разделах, таких как /procи /sys, что приводит к ошибкам на вашем экране, особенно если вы не root. (Ошибки можно скрыть, добавив 2> /dev/nullв конце команды find (комментарий должен быть удален))

Если у вас есть несколько разделов, и вы не знаете, в каком из них находится файл, вы можете получить список с помощью lsblk(в ОС на базе Linux dfвариант синтаксического анализа является опцией) и передать его в find: (снова root, если вы не знаю, можете ли вы получить доступ к файлу)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(Это немного хрупко, если на любой из ваших точек монтирования есть пробелы) ( dfпараметры могут нуждаться в настройке. -P заставляет GNU dfвыдавать стандартный вывод POSIX. В других версиях могут быть другие параметры или они должны быть опущены. Прочитайте вашу справочную страницу)

В grep -Fисключает другие вещи вернулись, как раздел подкачки.

В не-GNU версии awk находит устройства с монтированием, начинающимся с, /devдля получения реальных файловых систем, а затем выводит последнее поле (точку монтирования) из dfвыходных данных.

Это также подразумевает подобную борну оболочку ( kshи bashдолжна работать. Если вы используете cshвариант, запустите оболочку со сценарием, прежде чем пытаться это сделать)


В greps может быть немного шумно, научиться фильтровать лучше (это не должно быть необходимости в примере, но если это что - то более общее , что ищется, то отбирает нужно будет настраивать , чтобы сохранить уровень шума вниз)
Герт Ван ден Берг

0

ag (серебряный искатель) обеспечивает очень быстрый поиск в файлах, а также имеет возможность поиска по имени файла:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

Так что в моем случае использования здесь> в 30 раз быстрее, если файл не является файлом, игнорируемым ag.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.