我有一个包含文件的目录./src
。除了.c
中的.c
个文件外,我想提取其中的所有./src/test
个文件。我尝试了
find ./src -name "*.c" -and -not -name ./src/test
(灵感来自here)但没有一个成功。
我做错了什么?
答案 0 :(得分:3)
您可以使用grep
吗?
find ./src -name \*.c | grep -v ./src/test
答案 1 :(得分:3)
我会使用grep -v
后置过滤器,假设你的路径中没有换行符(空格就可以了):
find ./src -name "*.c" | grep -v '/src/test/'
我认为你的麻烦是-name
仅查看路径的最后一个元素,因此带有斜杠的-name
根本不起作用。
如果您的find
版本支持该版本,则使用-path
代替-name
可能会有效:
find ./src -name "*.c" -and -not -path './src/test/*'
注意修改后的操作数为-path
。
答案 2 :(得分:2)
您希望-regex
匹配整个路径(-name
仅匹配当前目录中的文件名)和-prune
以消除树的该部分:
find ./src -regex '^./src/test$' -prune -o -name '*.c' -print0 | xargs -0 ....
没有find
的{p> -print0
几乎总是一个问题,如果有人创建了一个带有空格的文件名(或更糟糕的换行符),那么等待发生。