Eri*_*lja 2 bash gnu-findutils
使用GNU findutils,我需要在目录树中搜索某个文件.如果找到了给定分支的文件,我想阻止find进一步递归到分支.假设我想找到文件foo,这是我的目录树:
??? a
? ??? a1
? ? ??? foo
? ??? foo
??? b
??? c
??? foo
Run Code Online (Sandbox Code Playgroud)
鉴于我正在搜索上面的树,我想找到一个/ foo和c/foo.但是,我不想找到/ a1/foo,因为我已经在a1的父目录中找到了foo.看来我应该使用-prune标志来查找命令,我发现这个链接https://unix.stackexchange.com/questions/24557/how-do-i-stop-a-find-from-descending-into-例如,found-directories,但我不能让它工作.我的尝试包括:
$ find -name foo -type f -prune
./a/a1/foo <- Unwanted hit
./a/foo
./c/foo
Run Code Online (Sandbox Code Playgroud)
和
$ find -name foo -type f -prune -exec find ../foo -type f {} \;
find: paths must precede expression: ./a/a1/foo
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
find: paths must precede expression: ./a/foo
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
find: paths must precede expression: ./c/foo
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Run Code Online (Sandbox Code Playgroud)
这将打印包含但foo不会在其子目录中递归的目录:
find -type d -exec test -f {}/foo \; -print -prune
Run Code Online (Sandbox Code Playgroud)
{}/foo POSIX显式未定义行为:
如果utility_name或参数字符串包含两个字符"{}",但不仅仅包含两个字符"{}",则它是实现定义的,无论find是替换这两个字符还是使用字符串而不进行更改.
但是与GNU一样正常工作find(你用gnu-findutils标记了这个问题).由于卡米尔·丘克正确地指出的评论,如果你使用非GNU find或者,如果你想要一个更便携的解决方案,使用:
find -type d -exec sh -c 'test -f "$1"/foo' -- {} \; -print -prune
Run Code Online (Sandbox Code Playgroud)