Двойные кавычки, используемые с сопоставленным значением с параметром -name в find

Двойные кавычки, используемые с сопоставленным значением с параметром -name в find

Почему совпадающее значение с параметром -namein findдолжно быть заключено в двойные кавычки?

# find / -type f -name *.out |wc -l 1>mv.out                                  
0403-027 The parameter list is too long.
# cat mv.out                                                   
       0
# find / -type f -name "*.out" |wc -l 1>mv.out                                   
# cat mv.out                                                                                           
  146302

решение1

Без двойных кавычек *.outрасширяется оболочкой, то есть заменяется всеми совпадающими именами файлов в текущем каталоге *.out(в основном любыми файлами, заканчивающимися .outи не начинающимися с точки). В вашем случае, похоже, есть по крайней мере два совпадающих файла, которые передаются findв качестве параметров. findне знает, что с ними делать, и жалуется, что список параметров слишком длинный.

Заключая шаблон в кавычки, оболочка оставляет его как есть, просто удаляя кавычки и findвидит один нетронутый параметр *.out, что, вероятно, и имелось в виду.

решение2

Я не уверен, что это точно правильно. Но я думаю, что заключение в кавычки заставляет парсер читать это как регулярное выражение. Без кавычек, я думаю, звездочка представляет все файлы в текущем каталоге.

Проверьте разницу в выводе между:

$ echo $(find ./ -name *)

и

$ echo $(find ./ -name "*")

Итак, при первой команде вы, скорее всего, получите ошибку. Если у вас есть файлыфу&барВ текущем каталоге звездочка представляет имена файлов. Поэтому парсер команд будет читать команду следующим образом:

$ echo $(find ./ -name foo bar)

И вывод ошибки будет таким find: bar: unknown primary or operator.

Вторая команда считывает звездочку как регулярное выражение, обозначающее поиск любого имени файла.

Редактировать:Хотя теперь, после более тщательного тестирования команд, похоже, что в моей системе они работают независимо от того, заключено ли значение аргумента в кавычки, при условии, что какой-то текст сочетается со звездочкой:

$ echo $(find ./ -name *foo)

такой же как

$ echo $(find ./ -name "*foo")

Может быть, я неправильно понял вопрос?

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