Трудно понять, что именно вы хотите получить.
Может быть, что-то вроде этого?
while true; do timeout 30 ./bash -a -f -x script; done
Во-первых, аргументом -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
Если вы знаете, что у вас есть файл с именем 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
просто разрешает нечувствительную к регистру версию этого.
Вы можете попробовать команду locate
. Он использует базу данных имен файлов, чтобы ускорить поиск.
Для поиска всех файлов, соответствующих *книге1*
, и игнорируя регистр, вы можете использовать
locate -i book1
, если вы хотите искать файлы , начиная с с книга1
. ] вам нужно будет сделать подстановочный знак самостоятельно:
locate -i 'book1*'
Это намного быстрее, чем find
, но актуально только на момент последнего обновления базы данных.
Для таких задач я всегда делаю:find / -iregex '.*Book1.*'
Эта форма позаботится о 3 пунктах вашего сценария(iregex
является нечувствительным к регистру рациональным выражением, и шаблон с .*
с обеих сторон будет соответствовать любому символу до и после вашего фиксированного шаблона Книги 1 -это, очевидно, может дать вам больше результатов, чем необходимо, но вы точно не пропустите файл)
Основное отличие :если возможно, будьте более строгими, чем просто использование /
, например, попробуйте только /home
или около того, иначе вы попадете в некоторые каталоги, которые не имеют отношения (/sys
, /dev
, и т.д…)
Однако помните, что разрешения Unix применяются :, если файл находится в каталоге, к которому пользователь, выполняющий команду find
, не имеет доступа (право выполнения ), find
не сможет найти это там.
Silver Searcher — очень быстрая и удобная утилита для поиска файлов и контента.
Чтобы решить вашу проблему, команда поиска серебра будет выглядеть так...
ag -g Book1
-g PATTERN
Печатать имена файлов, соответствующие ШАБЛОНУ
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
в конце команды поиска (комментарий следует удалить))
Если у вас есть несколько разделов и вы не знаете, на каком из них находится файл, вы можете получить список с помощью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
, запустите оболочку со сценариями , прежде чем пробовать это )
POSIXly,
LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'
Сообщит путь ко всем файлам, имя которых содержитbook1
(с любым вариантом регистра, но только с учетом латинских символов ASCII bokBOK
, а не многих других вариантов Unicode, таких как ,
,
,
ᵏ
, ₖ
, K
, k
и все их варианты с диакритическими знаками... )во всех каталогах, к которым у вас есть доступ для чтения.
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.
С Zsh вы можете использовать шаблоны глобусов, так что это тоже работает:
ls -a /**/book1
Это найдет все места, где находится файл с именем book1
.
В моем тестировании это оказалось быстрее, чем использование find
, а также почти не приводит к ошибкам разрешения пользователя при запуске без разрешения root
См. руководство .