【问题标题】:Calling find more than once on the same folder tree在同一个文件夹树上多次调用 find
【发布时间】:2015-06-15 15:46:09
【问题描述】:

我在同一组文件上多次运行 find 命令。我的 find 命令的结果通常是不相交的集合,AKA 我正在运行 find -mmin +35; find -mmin -25,对结果做不同的处理。

在一次搜索时多次搜索整个文件系统似乎有点愚蠢。有没有办法将多个“搜索参数”放入单个查找命令中,并根据它满足的参数将输出通过管道传输到不同的位置?

谢谢

【问题讨论】:

    标签: linux bash shell unix find


    【解决方案1】:

    试试这个:

    find . -mmin +35 -or -mmin -25
    

    find 支持多个逻辑运算符(-and、-or、-not)。有关更多详细信息,请参见手册页的 OPERATORS 部分。

    ===================== 编辑:针对有关以不同方式处理两个匹配项的问题,我不知道直接使用 find 执行此操作的方法。就我个人而言,我会做的是像这样在 for 循环中处理输出(注意这是伪代码):

    for f in `find . [condition 1] -or [condition 2]` ;do
        if [ f meets condition1 ]; then
            doSomething
        elif [ f meets condition2 ]; then
            doSomethingElse
        fi
    done
    

    我敢肯定,有很多 bash 大师可以更清洁、更高效地完成这项工作。

    【讨论】:

    • 但是有没有办法将 -mmin +35 的结果通过管道传输到一个命令(例如 rm),并将 -mmin -25 的结果传输到另一个命令(例如 rsync)?
    • 好的,我明白你在问什么。我最初的想法是“不”,因为输出在同一个流中。但是,如果您想将其放入循环中,以检查每个匹配项,那可能会起作用。我将编辑我的答案...
    【解决方案2】:

    您可以使用tee 将输出复制到两个不同的子shell 并进行不同的处理。

    find . -mmin +35 -or -mmin -25 | tee \
        >(while read f; do if [ $f meets condition1 ]; then; doSomething; done) \
        >(while read f; do if [ $f meets condition2 ]; then; doSomethingElse; done) \
        >/dev/null
    

    这是我阅读 EJK 的答案后想到的第一个解决方案。

    编辑:这是未经测试的。显示原理的工作示例如下:

    echo -e "abc\ndef\nauv\nafg\ndtt" | tee >(grep -P '^a' > a.txt) >(grep -P '^d' > d.txt) >/dev/null
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      相关资源
      最近更新 更多