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