从 find 命令的输出中删除修剪目录的名称

从 find 命令的输出中删除修剪目录的名称

我正在尝试使用 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/*' \)

相关内容