Почему совпадающее значение с параметром -name
in 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")
Может быть, я неправильно понял вопрос?