【问题标题】:Bash find command not operating in depth-first-searchBash find 命令未在深度优先搜索中运行
【发布时间】:2021-07-12 09:24:05
【问题描述】:

所以我读到 Bash 中的 find 命令应该与 DFS 一起运行,但我没有看到它发生。

我的路径树:

- tests_ex22 
     - first 
         - middle
              - story2.txt
         - story1.txt
     - last
        - story3.txt

我运行以下命令:

find $1 -name "*.$2" -exec grep -wi $3 {} \;

令我惊讶的是,“middle”中的元素打印在“first”中的元素之前。

find 到达新目录时,我希望它在移动到新目录之前先查看当前目录。但是,我确实希望它以 DFS 方式移动。

为什么会这样?我该如何解决? (ofc,我不必使用find)。

【问题讨论】:

  • 能否请您显示您得到的输出和您想要的输出?

标签: linux bash shell


【解决方案1】:

您的示例显示 find 以深度优先的方式运行。如果您想要广度优先的方式,有一个与 find 兼容的工具,但称为 bfs。

https://github.com/tavianator/bfs

【讨论】:

    【解决方案2】:

    middle first 的一个元素。它不在first 中的元素之前处理middle;它正在处理middle 作为first 元素处理的一部分。

    听起来您希望find 对条目进行排序并在目录条目之前处理所有非目录条目。恐怕没有这种模式。通常find 会按照找到它们的顺序处理目录条目,这是相当随意的。如果它以特定的顺序处理它们——比如,按字母顺序,或者文件在子目录之前——就需要对条目进行排序。 find 避免了这种开销。它不会对条目进行排序,甚至不是一个选项。

    这与ls 形成对比,后者确实对其输出进行了排序。 ls 旨在成为更人性化的显示工具,而 find 则用于脚本。

    按深度排序

    如果您主要打印文件名,您可以诱导find 打印每个条目的深度及其路径,然后手动按深度排序。像这样的:

    find "$1" -name "*.$2" -printf '%d\t%p\n' | sort -V | cut -f 2-
    

    您必须根据您的用例进行调整。在此处安装 grep 很棘手。

    手动循环

    或者您可以手动编写递归搜索。以下是一些起点:

    【讨论】:

    • 谢谢。你知道在这种情况下我该如何使用ls吗?
    • 我已经用一些起点更新了我的答案。如果您希望我对其中任何一个进行扩展,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多