Я пытаюсь найти файл с именем Book1 .
В моем тесте я пытаюсь найти вышеупомянутый файл, и в этом тесте я не знаю, где находится этот файл.
Я пытался, find / -iname book1
но нет выхода.
Как мне найти файл с именем book1 с помощью командной строки, если я не знаю, где находится файл?
РЕДАКТИРОВАТЬ:
Мой сценарий описан более подробно ниже:
- Расширение файла неизвестно
- Точное имя (т.е. заглавные буквы, цифры и т. Д.) Неизвестно
- Расположение файла неизвестно
command-line
files
find
Aspire27
источник
источник
Book1
, и он находится в каталоге, который вы можете прочитать, тоfind / -iname book1
найдете его. Вы уверены, что это на самом делеBook1
, а нетBook1.xyz
?find
иlocate
.locate
является щедрым и найдет все, что соответствует, если оно находится в его базе данных, которая обычно обновляется ежедневно.find
в данном случае ищет файловый глобус, тип шаблона, который вы использовали бы вls
. Вы, наверное, имеете в видуiname '*book1*'
. Обратите внимание, что шаблон должен быть внутри кавычек, чтобы оболочка не раскрыла его до того, какfind
увидит его. Также обратите внимание, чтоfind
, как и многие команды * nix, разочаровывающе тихо, когда это не удается.Ответы:
Во-первых, аргументом
-iname
является шаблон оболочки . Вы можете прочитать больше о шаблонах в руководстве по Bash . Суть в том, что для того,find
чтобы действительно найти файл, имя файла должно соответствовать указанному шаблону. Чтобыbook1
сопоставить строку без учета регистра,Book1.gnumeric
нужно либо добавить,*
чтобы она выглядела следующим образом:или укажите полное имя:
Во-вторых,
-iname
заставитfind
игнорировать регистр имени файла, поэтому, если вы укажете,-iname book1
он также может найтиBook1
иbOok1
т. Д. Если вы уверены, что файл, который вы ищете, вызываетсяBook1.gnumeric
, не используйте,-iname
но-name
это будет быстрее:В-третьих, помните о цитировании шаблона, как сказано в другом ответе .
И последнее - вы уверены, что хотите искать файл везде в вашей системе? Возможно, что файл, который вы ищете, на самом деле находится в вашем
$HOME
каталоге, если вы работали над этим или скачали его откуда-то. Опять же, это может быть намного быстрее.РЕДАКТИРОВАТЬ :
Я заметил, что вы редактировали свой вопрос. Если вы не знаете полного имени файла, заглавных букв и местоположения, вам действительно следует использовать что-то вроде этого:
Я также предлагаю поставить
2>/dev/null
в конце строки, чтобы скрыть все*permission denied*
и другие ошибки, которые будут присутствовать, если вы вызоветеfind
как пользователь без полномочий root:И если вы уверены, что ищете один файл, и в вашей системе есть только один файл, который соответствует критериям, которые вы можете указать
find
для выхода после нахождения первого соответствующего файла:источник
-iname
не портативенВы можете попробовать
locate
команду. Он использует базу данных имен файлов, чтобы сделать поиск быстрее.Для поиска всех совпадений файлов
*book1*
и игнорирования регистра вы можете использоватьесли вы хотите искать файлы, начинающиеся с,
book1
вам нужно будет сделать шаблон самостоятельно:Это намного быстрее, чем
find
, но только так актуально, как в последний раз, когда база данных обновлялась.источник
Если вы знаете, что у вас есть файл с именем
book1.something
, где местоположение файла, точное значениеsomething
и шаблон заглавных букв имени файла все неизвестны:Если все, что вы точно знаете, это то, что имя файла содержит слово
book
, вы можете создать гораздо больший список с помощьюАргументом
-name
является шаблон оболочки оболочки. Из каталога, в котором находится файл, сравните:Это представляет вид поиска, выполняемого
-name
.-iname
Опция просто позволяет регистронезависимую версию этого.источник
POSIXly,
Сообщит путь всех файлов, имя которых содержит
book1
(с любой вариации случая, но учитывая только ASCII латинские символыbokBOK
, а не много других вариантов в Unicode , как𝗄
,𝚔
,𝘬
,ᵏ
,ₖ
,K
,k
и все их вариации с диакритиками ...) в все каталоги, к которым у вас есть доступ для чтения.источник
Для таких задач я всегда делаю:
find / -iregex '.*Book1.*'
Эта форма будет заботиться о 3 пунктах вашего сценария (
iregex
это рациональное выражение без.*
учета регистра, и шаблон с обеих сторон будет соответствовать любому символу до и после вашего фиксированного шаблона Book1 - это, очевидно, может дать вам больше результатов, чем необходимо но вы точно не пропустите файл)Основное отличие: если возможно, будьте более строгими, чем просто используя
/
, например, пытаясь только/home
или около того, в противном случае вы попадете в не нужные каталоги (/sys
,/dev
и т. Д.)Помните, однако, что применяются разрешения Unix: если файл находится в каталоге, для которого пользователь, выполняющий
find
команду, не имеет права доступа (выполнения),find
он не сможет найти его там.источник
find
Silver Searcher - это очень быстрый и удобный инструмент для поиска файлов и контента.
Чтобы решить вашу проблему, команда поиска серебра должна выглядеть следующим образом ...
ag -g Book1
-g PATTERN
Распечатать имена файлов, соответствующие PATTERNисточник
locate
и его варианты, как правило, быстрый метод.Если поиск не доступен, вы можете использовать
find
вместо этого. Это имеет тенденцию быть намного медленнее, но также и намного более точным.Если у вас один раздел: (запустите от имени пользователя root, если у вашего пользователя нет доступа к файлу)
Если вы не включили
-xdev
find
поиск в других разделах, таких как/proc
и/sys
, что приводит к ошибкам на вашем экране, особенно если вы не root. (Ошибки можно скрыть, добавив2> /dev/null
в конце команды find (комментарий должен быть удален))Если у вас есть несколько разделов, и вы не знаете, в каком из них находится файл, вы можете получить список с помощью
lsblk
(в ОС на базе Linuxdf
вариант синтаксического анализа является опцией) и передать его в find: (снова root, если вы не знаю, можете ли вы получить доступ к файлу)(Это немного хрупко, если на любой из ваших точек монтирования есть пробелы) (
df
параметры могут нуждаться в настройке. -P заставляет GNUdf
выдавать стандартный вывод POSIX. В других версиях могут быть другие параметры или они должны быть опущены. Прочитайте вашу справочную страницу)В
grep -F
исключает другие вещи вернулись, как раздел подкачки.В не-GNU версии awk находит устройства с монтированием, начинающимся с,
/dev
для получения реальных файловых систем, а затем выводит последнее поле (точку монтирования) изdf
выходных данных.Это также подразумевает подобную борну оболочку (
ksh
иbash
должна работать. Если вы используетеcsh
вариант, запустите оболочку со сценарием, прежде чем пытаться это сделать)источник
grep
s может быть немного шумно, научиться фильтровать лучше (это не должно быть необходимости в примере, но если это что - то более общее , что ищется, то отбирает нужно будет настраивать , чтобы сохранить уровень шума вниз)ag (серебряный искатель) обеспечивает очень быстрый поиск в файлах, а также имеет возможность поиска по имени файла:
Так что в моем случае использования здесь> в 30 раз быстрее, если файл не является файлом, игнорируемым ag.
источник