我想在目录中找到扩展名为.hs
的所有文件,但要排除子目录sub
中的所有文件以及名称中包含test
的其他一些文件。
我阅读并尝试使用find
和prune
,但不理解复杂的逻辑,我的尝试都没有奏效。
天真的
find . -name "*.hs" -not -name '*sub*' -not -name "*test*"
也不是
find . -name "*.hs" -not -path '/sub' -not -name "*test*"
确实有效。我认为这个(相对)简单的问题应该有一个简单的解决方案。
似乎有效的解决方案是
find . -name "*.hs" -not -name "*test*" | grep -v "sub"
比使用prune
更简单,但肯定可以改进吗?
答案 0 :(得分:2)
您的第一次尝试会排除名称中包含sub
的所有文件。
您的第二次尝试会排除路径正好为/sub
的所有文件。
将两者合并以匹配路径包含sub
的所有文件:
-not -path "*sub*"
但是,-prune
是更好的解决方案,因为它会跳过目录而不是无效地匹配其中的每个条目。