Представьте себе исходное дерево. Везде есть 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: Обратите внимание, что вы должны заключать в кавычки шаблоны как само собой разумеющееся, иначе оболочка будет расширять любые подстановочные знаки в них.