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


14

我发现看起来像这样:

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”。我该怎么做呢?

谢谢!

Answers:


22

您可以使用该-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



1

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

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

或者您的查找返回相对路径:

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

最好的祝福,


1

扩大我认为@CharlesClavadetscher他的答案的意义。如果省略路径,-not -path ... find将继续沿路径下降。相反,使用-prune将阻止它进一步下降到省略的路径,从而使其更快。所以你可以做类似的事情

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

0

我在搜索文件时使用“不是全名”。 -name测试实际的文件名,但是-wholename测试完整的路径。因此,在上述问题中添加了测试忽略项:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.