Странное поведение функции find, если шаблон, следующий за -name, не заключен в кавычки

Странное поведение функции find, если шаблон, следующий за -name, не заключен в кавычки

Это так странно, что иногда следующий шаблон -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опции).

Связанный контент