Представьте себе исходное дерево. Везде есть xml-файлы.
Но поскольку в корне этого дерева находится XYZ.xml, он не найдет мои xml-файлы.
find -iname *.xml
возвращается
./XYZ.xml
вместо
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
Представьте себе исходное дерево. Везде есть xml-файлы.
Но поскольку в корне этого дерева находится XYZ.xml, он не найдет мои xml-файлы.
find -iname *.xml
возвращается
./XYZ.xml
вместо
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
Ответы:
find -iname '*.xml'
В противном случае ваша оболочка расширяется *.xml
до XYZ.xml
, и фактически выполняемая команда
find -iname XYZ.xml
Причина, по которой он работает, если в текущем каталоге нет файлов XML, заключается в том, что оболочки обычно оставляют подстановочные знаки нерасширенными, если они не совпадают с чем-либо. В общем, в любое время вы хотите подстановочные быть расширен с помощью программы, отличной от оболочки (например , с помощью find
, tar
, scp
и т.д.) , вы должны процитировать их так что оболочка не будет пытаться расширить их самостоятельно.
bash
, а не о find
.
Вы должны процитировать свой аргумент так:
find ./ -name '*.xml'
так что он передается для поиска вместо раскрытия оболочкой, а затем передается для поиска в качестве расширенной версии.
*.xml
в текущем каталоге ничего не совпадает, он передается буквально, поэтому он работает в другом случае. Очень полезный ответ.
Подстановочные знаки раскрываются оболочкой, а не командой. find
это одна из немногих команд, которая выполняет сопоставление с подстановочными знаками, аналогичное оболочке, в свое время.
При запуске ls *.xml
сначала оболочка расширяется *.xml
до списка подходящих файлов, например file1.xml
file2.xml
file3.xml
, а затем оболочка вызывает ls
полученный список аргументов file1.xml
file2.xml
file3.xml
. Вот почему вы видите тот же список имен файлов echo *.xml
, даже если echo
ничего не знаете о файлах и не заботитесь о том, являются ли его аргументы именами файлов.
Когда вы бежите find . -name "*.xml"
:
find
, .
, -name
, *.xml
где *
цитируются. Так *
как цитируется, это обычный символ, что касается оболочки.find
с указанным списком аргументов: .
, -name
, *.xml
.find
ищет файлы, чье имя соответствует шаблону *.xml
в любом каталоге в текущем каталоге.Когда вы запускаете find . -name *.xml
и нет подходящих файлов *.xml
:
find
, .
, -name
, *.xml
где *
не котируется.*.xml
содержит подстановочный знак без кавычек, оболочка выполняет генерацию имени файла. Поскольку нет подходящих имен файлов, шаблон остается нерасширенным.find
с результирующим списком аргументов, что .
, -name
, *.xml
.find
ищет файлы, чье имя соответствует шаблону *.xml
в любом каталоге в текущем каталоге.Когда вы запускаете find . -name *.xml
и текущий каталог содержит file1.xml
, file2.xml
и file3.xml
:
find
, .
, -name
, *.xml
где *
не котируется.*.xml
содержит подстановочный знак без кавычек, оболочка выполняет генерацию имени файла: *.xml
заменяется списком совпадающих имен файлов.find
с результирующим списком аргументов, который .
, -name
, file1.xml
, file2.xml
, file3.xml
.find
жалуется на синтаксическую ошибку при достижении file2.xml
.Когда вы запускаете find . -name *.xml
и текущий каталог содержит один соответствующий файл file.xml
:
find
, .
, -name
, *.xml
где *
не котируется.*.xml
содержит подстановочный знак без кавычек, оболочка выполняет генерацию имени файла: *.xml
заменяется списком совпадающих имен файлов.find
с результирующим списком аргументов, что .
, -name
, file.xml
.find
видит совершенно правильную команду, но, вероятно, это не то, что вы намеревались: find
велено искать файлы, вызываемые file.xml
в любом каталоге, а не искать какие-либо подходящие файлы *.xml
.(Оценка и расширение оболочки имеет много других функций. Я упомянул только те, которые актуальны здесь.)
(То, что я описываю, это поведение по умолчанию большинства распространенных оболочек: sh, bash, dash, ksh, ... Некоторые оболочки могут быть настроены для отображения ошибки вместо запуска команды с нерасширенными подстановочными знаками или для расширения несоответствующих подстановочных знаков до пустых список. Ни один из них не поможет здесь.)
Это работает на Solaris 10:
find /directory-to-search/* -prune -name "*gz"
.xml
.
Пожалуйста, попробуй:
find ./ -name *.xml
*
Всегда должны быть заключены в кавычки или спасшийся передать его найти.
man find
: Обратите внимание, что вы должны заключать в кавычки шаблоны как само собой разумеющееся, иначе оболочка будет расширять любые подстановочные знаки в них.