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.
精彩评论