开发者

Using find with -exec {}, is there a way to count the total?

I am using a command similar to this one:

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

Although, I am not using chmod, I am using a different command which I will not list here. This command is working fine. Howeve开发者_C百科r, there are thousands of files and directories to be operated on, and this operation takes some time. I am wondering if there is a way to display some sort of total when the operation is complete? Perhaps a count of modified files?

The only thing I can think of is simply to do something like:

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

Will that work? At least we can see that something is happening... Anyone have a better suggestion?


This works:

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

You have to include a second -exec /bin/echo for this to work. If the find command has no output, then wc has no input to count lines for.


You can chain multiple -exec commands with a single find command. The syntax for that is:

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

which in your case would look like this:

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

Although you have a few other options for this. You can redirect output to a file:

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

Or, you can use tee, which will allow you to write the output to a logfile, and still output to the screen. I find this useful, as the continuously-streamed output to the screen lets me know that the command is still running (not crashed or hung), and I still have the log file to refer to later.

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 '+'


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

If you use + instead of ";", find will try to process chmod 755 on many files in parallel.

You can perform additional commands after the first one, here, for example print a dot, and count the dots in the end.


You could use xargs and pv. Possibly:

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

Note: this is only going to work if your *.php files do not have any spaces or other odd characters in the path or name.


With the -exec option find will start a subprocess for each file found. You could speed this up by using xargs like find . -name '*.php' | xargs chmod 755 - chmod is started only once.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜