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

eth*_*pil 35 unix linux bash find

我正在使用类似于这个的命令:

find . -name "*.php" -exec chmod 755 {} \;
Run Code Online (Sandbox Code Playgroud)

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

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

find . -name "*.php" -exec chmod 755; echo "+"; {} \;
Run Code Online (Sandbox Code Playgroud)

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

Dav*_* W. 34

这有效:

$ find . -name "*.php" -exec chmod 755 {} \; -exec /bin/echo {} \; | wc -l
Run Code Online (Sandbox Code Playgroud)

您必须包含一秒-exec /bin/echo才能使用此功能.如果find命令没有输出,则wc没有输入来计算行数.

  • 在这种情况下,您只需将`-print`选项添加到find中,而不是执行第二个命令.类似的东西:`找到.-name"*.php"-print -exec chmod 755 {} \; | wc -l` (6认同)

Tim*_*Tim 9

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

find . -exec cmd1 \; -exec cmd2 \; -exec cmd3 \;
Run Code Online (Sandbox Code Playgroud)

在你的情况下,这将是这样的:

find . -name '*.php' -exec chmod 755 {} \; -exec echo '+' \;
Run Code Online (Sandbox Code Playgroud)

虽然你有其他一些选择.您可以将输出重定向到文件:

find . -name '*.php' -exec chmod 755 {} \; > logfile.txt
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用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 '+'
Run Code Online (Sandbox Code Playgroud)