我正在尝试为所有 JavaScript 文件运行find
命令,但是如何排除特定目录?
这是我们正在使用的find
代码。
for file in $(find . -name '*.js')
do
java -jar config/yuicompressor-2.4.2.jar --type js $file -o $file
done
如果-prune
不适合您,这将:
find -name "*.js" -not -path "./directory/*"
使用剪枝开关,例如,如果要排除misc
目录,只需在查找命令中添加-path ./misc -prune -o
:
find . -path ./misc -prune -o -name '*.txt' -print
这是一个包含多个目录的示例:
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
这里我们排除 dir1,dir2 和 dir3,因为在find
表达式中它是一个动作,它作用于条件-path dir1 -o -path dir2 -o -path dir3
(如果 dir1 或 dir2 或 dir3),ANDed type -d
。进一步的行动是-o print
,只需打印。
我发现以下比其他提出的解决方案更容易推理:
find build -not \( -path build/external -prune \) -name \*.js
这来自一个实际的用例,我需要在 wintersmith 生成的一些文件上调用 yui-compressor,但是遗漏了需要按原样发送的其他文件。
内部\(
和\)
是一个完全匹配build/external
的表达式(例如,如果find ./build
,它将不匹配 - 在这种情况下需要将其更改为./build/external
),以及成功的话,会避免穿越下面的任何东西 。然后将其分组为带有转义括号的单个表达式,并以-not
为前缀,这将使find
跳过与该表达式匹配的任何内容。
有人可能会问,如果添加-not
不会使-prune
隐藏的所有其他文件重新出现,答案是否定的。 -prune
工作方式是,一旦到达,该目录下面的文件将被永久忽略。
这也很容易扩展,以添加额外的排除。例如:
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js