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