递归搜索目录中的文件名,如果找到则停止降序

递归搜索目录中的文件名,如果找到则停止降序

我有一个目录树,其中包含同名的文件,例如:

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,该工具将打印相关的目录路径名,而不是文件。要打印fileprintf在内壳中使用的路径。

相关内容