1

我有一个./src包含文件的目录。我想提取其中的所有文件.c,除了. 我已经尝试过.c./src/test

find ./src -name "*.c" -and -not -name ./src/test

(灵感来自这里)但没有一个成功。

我究竟做错了什么?

4

3 回答 3

3

你能用grep吗?

find ./src -name \*.c | grep -v ./src/test

于 2012-04-30T17:02:49.587 回答
3

我会使用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

于 2012-04-30T17:04:30.050 回答
2

您想-regex匹配整个路径(-name仅匹配当前目录中的文件名)并-prune消除树的那部分:

find ./src -regex '^./src/test$' -prune -o -name '*.c' -print0 | xargs -0 ....

find-print0如果有人创建了一个带有空格的文件名(或者更糟的是换行符),那么没有几乎总是一个等待发生的问题。

于 2012-04-30T17:15:47.037 回答