我试图在我的项目的子目录中找到所有 javascript 文件。
工作树如下:
.
├── app
├── assets
├── components
├── email.txt
├── gulpfile.js
├── node_modules
└── package.json
为此我说:
find . -name *.js
或者
find . -path *.js
奇怪的是,第一个命令仅报告gulpfile.js
,而第二个命令则什么也不报告。但我有.js
文件app
,components
并且node_modules
!他们为什么不出现?
答案1
将单引号括起来*.js
。如果没有引号,shell 会将通配符扩展为当前目录中匹配的文件名,因此find
仅获取当前目录或查找规范中的子目录中的这些文件名(但永远看不到通配符)。要将其指定为要使用的模式find
,您需要防止 shell 扩展。'*.js'
这样做。
答案2
人们很容易忘记 shell 通配符在此过程中仍然发挥着作用。因此,您需要一种方法来告诉 shell 避免扩展*
到文件列表。一种方法是通过克里斯·约翰逊提到的——引用。
另一种是通过转义*
字符,如
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 +++