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

Трудно понять, что именно вы хотите получить.

Может быть, что-то вроде этого?

while true; do timeout 30 ./bash -a -f -x script; done
23
01.05.2017, 01:20
10 ответов

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

find / -iname 'book1*'

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

find / -iname 'Book1.gnumeric'

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

find / -name 'Book1.gnumeric'

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

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

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

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

find / -iname 'book1*'

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

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

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

find / -iname 'book1*' -print -quit 2>/dev/null
48
27.01.2020, 19:41

Если вы знаете, что у вас есть файл с именем 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

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

5
27.01.2020, 19:41

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

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

locate -i book1

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

locate -i 'book1*'

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

6
27.01.2020, 19:41

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

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

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

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

0
27.01.2020, 19:41

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

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

ag -g Book1

-g PATTERNПечатать имена файлов, соответствующие ШАБЛОНУ

0
27.01.2020, 19:41

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

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

Если у вас есть несколько разделов и вы не знаете, на каком из них находится файл, вы можете получить список с помощью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типа Bourne -должны работать. Если вы используете вариант csh, запустите оболочку со сценариями , прежде чем пробовать это )

.
0
27.01.2020, 19:41

POSIXly,

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

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

2
27.01.2020, 19:41

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.

1
27.01.2020, 19:41

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

ls -a /**/book1

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

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

См. руководство .

1
10.03.2020, 02:17
find /  -type f -iname "book[0-9].*" 
0
10.03.2020, 09:00

Теги

Похожие вопросы