В чем разница между \*.xml
и *.xml
в команде find в Linux/Mac
Результат:
find . -name \*.xml and find . -name *.xml
отличаются. Но почему?
Также, что locate '*.xml'
лучше, чем find? Какой из них наиболее часто используется?
решение1
Экранируя звездочку, вы даете find
буквальную строку *.xml
для сопоставления, которую она может проанализировать как подстановочный знак внутри, независимо от оболочки. Если вы не экранируете или не заключаете звездочку в кавычки, она будет расширена оболочкой, прежде чем команда find
вообще ее коснется.
Например, если somefile.xml
в вашем каталоге только один файл, оболочка расширит подстановочный знак и передаст somefile.xml
вашей команде буквальную строку, то есть:
sh-4.1$ find . -name *.xml
будет полностью эквивалентно:
sh-4.1$ find . -name somefile.xml
что будет соответствовать только этому точному имени файла. Если у вас в каталоге есть два файла, которые соответствуют *.xml
подстановочному знаку, вы, вероятно, получите синтаксическую ошибку при раскрытии подстановочного знака:
sh-4.1$ find . -name somefile.xml someotherfile.xml
find: paths must precede expression: someotherfile.xml
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Что касается того, locate
лучше это или нет, это действительно зависит от того, для чего вы его используете. Хотя locate
он намного быстрее, он полагается на предварительно созданный индекс, поэтому он хорош только настолько, насколько хорош последний индекс (обычно выполняется ежедневно, но это зависит от дистрибутива). Кроме того, он возвращает результаты только на основе совпадений имен файлов, тогда как find
позволяет использовать множество опций для уточнения поиска.