【问题标题】:Prevent Unix "find" command from recursing into matched directories防止 Unix“查找”命令递归到匹配的目录
【发布时间】:2015-05-21 00:00:32
【问题描述】:

考虑以下命令来查找和更新特定目录中的所有 git 存储库:

find . -type d -name .git | while read src_dir; do
    my_git_update "${1}";
done;

假设一个 repo 不能包含其他 repo,因此深入该目录是没有意义的。我没有使用子模块等,所以嵌套案例不计入这个问题。所以总的来说...

有没有办法告诉find 在找到匹配项后停止递归到目录中?

根据我的搜索,答案可能在于-prune,但我无法确切知道如何在我的情况下使用它。


Unix 'find' without descending into matched directories 不是重复,尽管有标题。它侧重于删除子目录 - 该解决方案不适用于此处。

【问题讨论】:

  • 如果你不能让 find 做你想要的,“递归查找 .git 直到找到”并不难在 Perl 中作为伪单行器编写。
  • @ThorbjørnRavnAndersen 没错,我通常使用 ruby​​ 或 perl 脚本。这个问题更倾向于好奇心,带有便携性和极简主义的暗示:)
  • 据我所知,最初的发现并不支持你在这里需要的东西,所以如果你发现一个魔法咒语,你可能会发现它只适用于某些系统而不是全部。例如,OS X 更倾向于 BSD,而 Linux 更倾向于 GNU,因此高级脚本需要额外考虑才能在所有系统上运行的情况并不少见。

标签: git bash unix recursion find


【解决方案1】:

你是对的,答案是-prune

这个主要的总是评估为真。它导致 find 不 下降到当前文件。请注意,-prune 主要没有 如果指定了-d 选项则生效。

-d-depth 在这个特定的 find 中本质上是同义词)。

-print比较:

这个主要的总是评估为真。它打印路径名 当前文件到标准输出。

这意味着您以相同的方式使用它们:在测试了先前的条件并确定您位于不应递归遍历的目录之后,只需 -prune 即可继续前进到下一个目录。 (-d 使其无效的原因是-dfind 代码已经运行了目录中的所有内容,因此继续进行的修剪步骤无论如何都会发生。)

【讨论】:

  • 我对实际语法不太清楚。在我的示例中,我究竟将-prune 选项放在哪里?如图所示,当我通过管道传输到另一个命令时它会起作用还是我必须以某种方式使用-exec
  • 将它放在与 -print 相同的位置。例如,假设您要查找 14 天内未修改的项目(目录/文件):find <path> -mtime +14 -print。进一步假设在打印之后,如果它是一个目录,您想跳过该目录中的任何子目录:在-print 之前或之后添加-prune-prune 有效地清除了“这是一个目录,所以 find 必须递归到它”,所以它对普通文件是无害的)。
  • 举一个更有趣的例子,假设您想查找名称与*.updateme 匹配的所有文件除非它们位于名为*.pruneme 的目录中。然后:find . ( -type d -name '*.pruneme' -prune ) -o ( -name '*.updateme' -print ) 就足够了。这里我们需要-o(“或”)运算符,因为-name '*.pruneme' 在名为*.updateme 的事物上失败。从技术上讲,括号不是必需的,因为语法表明未加括号的“and”操作必须比“or”操作更紧密地绑定(如果没有显式操作符,则隐含-a =“and”)。
猜你喜欢
  • 2013-04-24
  • 2018-06-08
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多