在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 

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

谢谢!

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

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

请注意两件事

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

顺便说一下,我不确定你为什么使用括号,它没有什么区别。 它仅用于优先级,用于构造如! \( -name '*bla*' -name '*foo*' \) ! \( -name '*bla*' -name '*foo*' \) (也就是说,找不到同时包含blafoo东西)。

进一步改进:不需要使用bash循环,你可以简单地做

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

where …是要find的其他参数。

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

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

您可以尝试使用这样的grep(此处的文件夹名为test_folder):

 find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line 

或者如果你的find返回相对路径:

 find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line 

或者如果您希望所有具有相同名称但具有不同路径的文件夹

 find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line 

最好的祝福,

为了扩展我认为@CharlesClavadetscher的回答。 如果省-not -path ...的路径-not -path ... find将继续降序路径。 相反,使用-prune将阻止它进一步下降到省略的路径,使其更快。 所以你可以做点什么

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

我只是在搜索文件时使用“not wholename”。 -name测试实际文件名,但-wholename测试完整路径。 因此,为上述问题添加一个忽略测试:

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