I use the following line to find all sub-directories of the PWD and run svnadmin verify on each directory (I already know that they're Subversion repositories)
find ./* -maxdepth 0 -exec svnadmin verify {} \;This works well, other than the fact that the output looks like this:
* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.I'd really like find to print the filename before executing the svnadmin verify command, to make logging easier.
I've tried to squeeze a little ls in there but bodged it up, how should I do this (preferably simply)?
9 Answers
simply add a -printf option before
find -printf '%p' -exec command \; 3 If you don't want to recurse, there's no point in using find. It is far simpler to do it in the shell directly:
for d in */; do echo "$d"; svnadmin verify "$d"; doneThe for d in */ will find all directories (the */ ensures only directories and no files are found); the echo "$d" will print the directory's name; the svnadmin verify "$d" will check the directory.
This can be run either directly from the command line or from within a script with no change in format.
3find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;I have added -type d if it is only directories.
Try this:
for f in * ; do echo -n "${f}:"; svnadmin verify "${f}"; doneIf you just want directories(Thanks to @kos note):
for f in */ ; do echo -n "${f}:"; svnadmin verify "${f}"; done 3 - Use
. -maxdepth 1instead of./*, you need only the first level in the folder structure - Use
-type d, you need only folders - Use
! -name ".", you don't need. - Use
-execto start a shell - Use
sh -cto start commands inside the shell
Your command
find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;or shorter
- Use
-pruneif the file is a directory, do not descend into it
Your command
find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 1 find has option flags for printing, which are already mentioned in other answers. If we look at the problem form the perspective of executing multiple commands for the same currently processed file, find allows using multiple -exec statements. This means we could opt for using:
find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; Again, note that this approach is applicable to not just printing with echo, printf, or other utilities, but also other commands.
This will print the name and contents of files-only recursively..
find . -type f -printf '\n\n%p:\n' -exec cat {} \; Best use find with XARGS, as it has verbose option exactly for this:
xargs --verbose / -t Print the command line on the standard error output before executing it.So in your example:
find ./* -maxdepth 0 -type d | xargs -n1 --verbose svnadmin verify
svnadmin verify ./REPO_DIR_A
* Verified revision ...
svnadmin verify ./REPO_DIR_B
* Verified revision ... It may be useful to pipe the find output to read loop:
find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; doneIt allows you to execute more complicated, compound command sequence with filenames returned by find, like in this fancy ls example:
find . | while read f; do echo ${f} | figlet -k; done