
Это так странно, что иногда следующий шаблон -name в find мог неожиданно успешно найти все соответствующие имена файлов. По правде говоря, он мог искать только одно соответствующее имя файла в текущем каталоге через shell parse (не утилита find, которая без кавычек).
find /tmp -type f -name *.txt
/tmp/amp_iostat.txt
/tmp/awrrpt_1_7950_7973.txt
/tmp/oplanlog/osys/2014-07-01-12-26-28/log.txt
/tmp/oplanlog/osys/2014-07-01-13-15-33/log.txt
/tmp/oplanlog/osys/2014-07-01-13-17-58/log.txt
/tmp/oplanlog/osys/2014-07-01-13-30-27/log.txt
/tmp/oplanlog/osys/2016-10-27-19-38-50/log.txt
/tmp/pms2_20170427.txt
/tmp/pmsdb1_20170622.txt
/tmp/pmssh1_20160728.txt
/tmp/pmssh1_20160831.txt
/tmp/pmssh1_20161227.txt
/tmp/pmssh1_20170328.txt
/tmp/pmssh1_20170523.txt
/tmp/pmssh1_20170727.txt
/tmp/pmssh1_20170822.txt
/tmp/pmssh2_20170328.txt
/tmp/pmssh_20170119.txt
/tmp/pmssh_20170220.txt
/tmp/sgpms_20140717_1736_summary.txt
/tmp/sgpms_20140717_1736_trace.txt
/tmp/sgpms_20140717_1737_summary.txt
/tmp/sgpms_20140717_1737_trace.txt
/tmp/sgpms_20140717_1739_summary.txt
/tmp/sgpms_20140717_1739_trace.txt
/tmp/sgpms_20140717_1743_summary.txt
/tmp/sgpms_20140717_1743_trace.txt
/tmp/sgpms_20140717_1749_summary.txt
/tmp/sgpms_20140717_1749_trace.txt
/tmp/sgpms_20140717_1751_summary.txt
/tmp/sgpms_20140717_1751_trace.txt
find /tmp -type f -name *.txt|wc -l
31
решение1
Без какого-либо цитирования *.txt
подлежитрасширение имени пути (также известное как расширение имени файла). Это происходит втекущий рабочий каталог(CWD). Если CWD содержит файлы с расширением 'txt', то перед вызовом find
оболочка заменяет *.txt
параметр соответствующими именами файлов, и ваша команда становится примерно такой:
find /tmp -type f -name file1.txt file2.txt file3.txt ...
В зависимости от того, вернется ли расширение, вы можете получить как минимум три результата...
- ...несколько файлов:вы получите сообщение об ошибке
- ...один файл и его имя совпадает с именем файла в путях,
find
с которыми вы работаете:тест-name
будет соответствовать только этому одному файлу - ...один файл, и он не соответствует ни одному файлу в искомом пути(ах):
-name
не будет соответствовать ничему
С другой стороны, если CWD делаетнетсодержат любые текстовые файлы, затем *.txt
передаются find
и ведут себя точно так же, как если бы вы их заключили в кавычки.
Мораль: при использовании find
всегда заключайте в кавычки шаблоны, содержащие подстановочные знаки, если только вы на самом деле не хотите, чтобы произошло расширение имени пути (редко можно увидеть, как это делается намеренно для этой -name
опции).