我有一个目录树,其中包含同名的文件,例如:
a/file
a/...
a/b/file
x/a/file
x/a/...
x/b/file
我试图使用find
(with-exec
和-prune
) 来获取file
递归搜索树时首先出现的所有路径。我的示例将返回:
a/file
x/a/file
x/b/file
它不会返回,a/b/file
因为调用的文件file
已经在a/
.
我如何使用 Bash 实现这一目标?
答案1
find . -type d -exec sh -c '
f="$1"/file
[ -e "$f" ] && { printf "%s\n" "$f"; true; }
' find-sh {} \; -prune
file
我没有查找文件,而是查找目录并测试每个目录中是否存在。如果file
存在,则打印其路径并-prune
为该目录激活。
笔记:
true
-prune
即使printf
由于某种原因失败,也能确保完成其工作。在此解决方案中,
find
从不处理任何内容file
,它处理目录。如果您想使用 执行某些操作file
,可以使用 在内壳中执行此操作$f
。示例:如果我使用
… -prune -print
,该工具将打印相关的目录路径名,而不是文件。要打印file
我printf
在内壳中使用的路径。