在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*' \)
(也就是说,找不到同时包含bla
和foo
东西)。
进一步改进:不需要使用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*"