【问题标题】:Using find with -exec {}, is there a way to count the total?使用 find 和 -exec {},有没有办法计算总数?
【发布时间】:2011-10-11 12:18:38
【问题描述】:

我正在使用与此类似的命令:

find . -name "*.php" -exec chmod 755 {} \;

虽然,我没有使用 chmod,但我使用的是不同的命令,我不会在此列出。这个命令工作正常。但是,有成千上万的文件和目录要操作,而且这个操作需要一些时间。我想知道是否有办法在操作完成时显示某种总计?也许是修改文件的计数?

我唯一能想到的就是做这样的事情:

find . -name "*.php" -exec chmod 755; echo "+"; {} \;

这行得通吗?至少我们可以看到正在发生的事情……有人有更好的建议吗?

【问题讨论】:

  • 帮助其他可能遇到文件名和空格问题的人。您可以在 {} 周围加上引号,以解析处理文件/目录。寻找 。 -name "*.php" -exec chmod 640 "{}" \;

标签: linux bash unix find


【解决方案1】:

这行得通:

$ find . -name "*.php" -exec chmod 755 {} \; -exec /bin/echo {} \; | wc -l

您必须添加第二个 -exec /bin/echo 才能使其正常工作。如果find 命令没有输出,则wc 没有输入来计算行数。

【讨论】:

  • 这是我用的。非常适合我。这是我的最终命令……它还在计数末尾添加了一些文本……find . -name "*.php" -exec chmod 755 {} \; -exec /bin/echo {} \; | wc -l | { read count; echo "Done. $count php file(s) processed."; }
  • 在这种情况下,您只需将-print 选项添加到查找中,而不是执行第二个命令。比如:find . -name "*.php" -print -exec chmod 755 {} \; | wc -l
  • @FelipeFG - 你可能是对的。我从未将-exec-print 结合使用,但我想它没有理由不起作用。
  • 此解决方案假定要执行的命令不会自行打印出来。
【解决方案2】:

您可以使用单个 find 命令链接多个 -exec 命令。其语法是:

find . -exec cmd1 \; -exec cmd2 \; -exec cmd3 \;

在你的情况下看起来像这样:

find . -name '*.php' -exec chmod 755 {} \; -exec echo '+' \;

尽管您对此还有其他一些选择。您可以将输出重定向到文件:

find . -name '*.php' -exec chmod 755 {} \; > logfile.txt

或者,您可以使用tee,这将允许您将输出写入日志文件,并且仍然输出到屏幕。我觉得这很有用,因为屏幕上的持续流式输出让我知道命令仍在运行(没有崩溃或挂起),而且我仍然有日志文件可供稍后参考。

find . -name '*.php' -exec chmod 755 {} \; | tee logfile.txt
wc -l logfile.txt           // prints the lines in the file
grep -c '^+$' logfile.txt   // prints the lines containing a single '+'

【讨论】:

    【解决方案3】:
    find . -name "*.php" -exec chmod 755 {} + -printf '.' | wc -c
    

    如果您使用 + 而不是“;”,find 将尝试在许多文件上并行处理 chmod 755。

    您可以在第一个命令之后执行其他命令,例如打印一个点,然后计算最后的点数。

    【讨论】:

      【解决方案4】:

      您可以使用xargspv。可能:

      find . -name "*.php" | pv --line-mode | xargs chmod 755
      

      注意:这只有在您的 *.php 文件的路径或名称中没有任何空格或其他奇数字符时才有效。

      【讨论】:

      • 使用-print0 查找和-0 用于xargs,它将解决您所有与空间相关的问题
      • @Hasturkun 如果您想使用pv,则不要。如果您不使用新行从find 输出输出,则不能对pv 使用--line-mode 开关。如果您不使用该开关,那么想出一种方法来告诉pv 预计会有多少数据会有点棘手。
      • 是的,虽然一点 bash 技巧可能可以解决这个问题,例如。 find . -name "*.php" -print0 -fprint >(pv --line-mode) | xargs -0 chmod 755
      【解决方案5】:

      使用 -exec 选项 find 将为找到的每个文件启动一个子进程。您可以通过使用像 find . -name '*.php' | xargs chmod 755 这样的 xargs 来加快速度 - chmod 只启动一次。

      【讨论】:

      • 您的第二段不正确。 xargs 知道如何限制长命令,这是相同的常见用法。
      • 如果文件名中有空格、制表符或 NL,请注意 xargs。此外,xargs 不一定采用所有文件的名称。它填满命令行缓冲区,执行命令,然后获取下一组文件。
      • Linux 的 gnu-find 也可以选择并行处理多个文件,如果以加号结尾:find . -name "*.php" -exec chmod 755 {} +。您几乎不需要 xargs 和 find。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多