В чем разница между \*.xml
и *.xml
в команде find в Linux/mac
Результат:
find . -name \*.xml and find . -name *.xml
разные. Но почему?
Кроме того, locate '*.xml'
лучше, чем найти? Какой из них наиболее часто используется?
Избегая звездочки, вы даете возможность 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
позволяет использовать множество параметров для уточнения поиска.