在Linux中查找文件并排除特定目录

在Linux中查找文件并排除特定目录

我发现如下内容:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

我想在查找中添加以排除名为“test”的目录,但我似乎无法弄清楚如何以某种方式添加“-type d”。我该怎么做?

谢谢!

答案1

您可以使用-path选项来查找并将其与-not运算符结合使用。

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

请注意两件事

  • -path必须作为第一个参数
  • 模式匹配整个文件名,因此-path test永远不会匹配任何内容

顺便说一句,我不确定你为什么要使用括号,这没什么区别。它仅用于优先级,用于诸如! \( -name '*bla*' -name '*foo*' \)(即,不会找到同时具有bla和的东西foo)。

进一步改进:不需要使用 bash 循环,只需执行

find . ... -exec cat {} \; -exec echo \;

其中 ... 是 的其他参数find

答案2

find / -path ./test -prune -o ...

重命名./test以适合您的测试目录的位置。

答案3

扩展一下我认为@CharlesClavadetscher他回答的目的。如果你省略了一条路径,-not -path ... find则将继续沿该路径下降。相反,使用-prune将阻止它进一步下降到省略的路径中,从而使其更快。因此,你可以执行以下操作

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

答案4

当我仅搜索文件时,我使用“非全名”。 -姓名测试实际的文件名,但是-全名测试完整路径。因此,在上述问题中添加对测试的忽略:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"

相关内容