¿Cómo se genera el nombre del archivo en el comando find mientras se usa -exec?

21

Utilizo la siguiente línea para buscar todos los subdirectorios de PWD y ejecutar svnadmin verify en cada directorio (ya sé que son repositorios de Subversion)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

Esto funciona bien, aparte del hecho de que el resultado sea el siguiente:

* 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.

Me gustaría que find imprima el nombre de archivo antes de ejecutar el comando svnadmin verify , para facilitar el registro.

Intenté exprimir un poco de ls , pero lo abordé, ¿cómo debo hacer esto (de preferencia simplemente)? ​​

    
pregunta Arronical 22.07.2015 - 11:48

7 respuestas

25

simplemente agrega una opción -printf antes de

find -printf '%p' -exec command \;
    
respondido por el Fiximan 22.07.2015 - 11:59
12

Si no desea recurse, no tiene sentido usar find . Es mucho más simple hacerlo directamente en el shell:

for d in */; do echo "$d"; svnadmin verify "$d"; done

El for d in */ encontrará todos los directorios (el */ asegura solo los directorios y no se encuentran archivos); el echo "$d" imprimirá el nombre del directorio; el svnadmin verify "$d" comprobará el directorio.

Esto puede ejecutarse directamente desde la línea de comando o desde un script sin cambios en el formato.

    
respondido por el terdon 22.07.2015 - 12:14
6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

He añadido -type d si solo son directorios.

    
respondido por el 7171u 22.07.2015 - 11:53
5

Pruebe esto:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

Si solo quieres directorios (gracias a @kos note):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done
    
respondido por el Maythux 22.07.2015 - 11:59
2
  • Use . -maxdepth 1 en lugar de ./* , solo necesita el primer nivel en la estructura de carpetas
  • Use -type d , solo necesita carpetas
  • Usa ! -name "." , no necesitas .
  • Use -exec para iniciar un shell
  • Use sh -c para iniciar comandos dentro del shell

Su comando

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

o más corto

  • Use -prune si el archivo es un directorio, no descienda en él

Su comando

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 
    
respondido por el A.B. 22.07.2015 - 12:18
0

Puede ser útil conectar el find output a read loop:

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

Te permite ejecutar una secuencia de comandos compuesta más complicada con nombres de archivo devueltos por find , como en este ejemplo de lujo ls :

find . | while read f; do echo ${f} | figlet -k; done
    
respondido por el Ves 09.06.2017 - 14:54
0

find tiene indicadores de opción para imprimir, que ya se mencionan en otras respuestas. Si observamos el problema desde la perspectiva de ejecutar múltiples comandos para el mismo archivo procesado actualmente, find permite usar múltiples declaraciones -exec . Esto significa que podríamos optar por usar:

find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; 

De nuevo, tenga en cuenta que este enfoque es aplicable no solo a la impresión con echo , printf u otras utilidades, sino también a otros comandos.

    
respondido por el Sergiy Kolodyazhnyy 27.05.2018 - 23:49

Lea otras preguntas en las etiquetas