我正在尝试使用 find 命令在目录及其部分子目录中生成源文件列表。例子:
/Source_Files
/dontexclude
dontexclude.h
dontexclude.c
/exclude
exclude.c
exclude.h
main.c
test.c
test.h
我想要一个以“.c”和“.h”结尾的文件列表,并且我想排除 /exclude 子目录的内容。
find -name '*.c' -o -name '*.h' -o -path '*/exclude' -prune
产生这个输出:
./test.h
./exclude
./test.c
./main.c
./dontexclude/dontexclude.c
./dontexclude/dontexclude.h
我怎样才能find
在没有“./exclude”的情况下生成上面的列表?
答案1
find . -name excludeme -prune -o \
\( -name '*.c' -o -name '*.h' \) -print
请记住和(隐式)优先于或者( -o
)。 (也可以看看-name '*.[ch]'
)
答案2
最简单的更改是替换-prune
(不要再在这个目录中查找), 为-prune -false
(不要在这个目录中不再查找,这不是匹配)。
答案3
以一些额外的文件系统操作为代价,将搜索限制为纯文件。这将排除该exclude
目录,因为它不是文件:
find . \( -name '*.c' -o -name '*.h' -o -path '*/exclude' -prune \) -type f
答案4
此命令返回您所询问的内容:
find . \( -name '*.c' -o -name '*.h' \) -a \! \( -path './exclude/*' \)