为什么在子目录中找不到列表文件?

为什么在子目录中找不到列表文件?

我试图在我的项目的子目录中找到所有 javascript 文件。

工作树如下:

.
├── app
├── assets
├── components
├── email.txt
├── gulpfile.js
├── node_modules
└── package.json

为此我说:

find . -name *.js

或者

find . -path *.js

奇怪的是,第一个命令仅报告gulpfile.js,而第二个命令则什么也不报告。但我有.js文件appcomponents并且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.jsfile2.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 +++

相关内容