协慌网

登录 贡献 社区

如何在 find 中排除目录。命令

我正在尝试为所有 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