使用find with -exec {},有没有办法计算总数?

时间:2011-10-10 23:25:23

标签: linux bash unix find

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

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

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

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

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

那会有用吗?至少我们可以看到正在发生的事情......任何人都有更好的建议吗?

5 个答案:

答案 0 :(得分:34)

这有效:

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

您必须包含第二个-exec /bin/echo才能生效。如果find命令没有输出,则wc没有输入来计算行数。

答案 1 :(得分:9)

您可以使用单个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 '+'

答案 2 :(得分:2)

find . -name "*.php" -exec chmod 755 {} + -printf '.' | wc -c

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以使用xargspv。可能:

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

注意:仅当您的* .php文件在路径或名称中没有任何空格或其他奇数字符时才会起作用。