Легко забыть, что подстановка оболочки по-прежнему играет роль в этом процессе. Таким образом, вам нужен способ сообщить оболочке, чтобы она не раскрывала *
до списка файлов. Один из способов - это то, что упомянул Крис Джонсон - цитирование.
Другой - экранирование символа *
, как в
find . -iname \*.js
Сравните:
$ strace -e trace=execve find -maxdept 1 -iname *.js > /dev/null
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "file1.js", "file2.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++
$ strace -e trace=execve find -maxdept 1 -iname \*.js > /dev/null
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++
В первом случае мы видим, что *
был расширен до списка файлов file1 .js
и file2.js
, которые присутствуют в текущем рабочем каталоге. Во втором примере - *
рассматривается как буквальный аргумент для find
. Фактически, это тот же результат, полученный при цитировании аргумента:
$ strace -e trace=execve find -maxdept 1 -iname '*.js' > /dev/null
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++
В качестве альтернативы вы можете вместо этого использовать восьмеричное значение *
.
$ strace -e trace=execve find -maxdept 1 -iname $'\52'.js > /dev/null
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++