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


33

Utilizo la siguiente línea para encontrar todos los subdirectorios del PWD y ejecuto svnadmin verifyen cada directorio (ya sé que son repositorios de Subversion)

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

Esto funciona bien, aparte del hecho de que la salida se ve así:

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

Realmente me gustaría findimprimir el nombre del archivo antes de ejecutar el svnadmin verifycomando, para facilitar el registro.

Traté de apretar un poco lsallí, pero lo armé, ¿cómo debo hacer esto (preferiblemente simplemente)?

Respuestas:


36

simplemente agregue una -printfopción antes

find -printf '%p' -exec command \;

44
Encantador, cambié '%p'a '%p\n'para que el nombre preceda al resultado de verificación en su propia línea.
Arronical

17
@Arronical si ese es el formato que desea, puede reemplazar el (formateado) -printf '%p\n'con el más simple-print
steeldriver

44
find -name <a_name> -print -exec command {} \;
toliveira

14

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

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

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

Esto se puede ejecutar directamente desde la línea de comandos o desde un script sin cambio de formato.


1
Esto parece una mejor manera de lograr mi objetivo, pero tuve que darle la respuesta a Fiximan solo porque mi título y mi pregunta hacen referencia find. ¡Gracias por mejorar mi conocimiento!
Arronical

Esto requiere usar un globo. Globbing es sin duda útil y poderosa, pero en mi experiencia personal la sintaxis es más difícil de configurar, y con frecuencia termina encima de necesitar otras cosas por el estilo dotgloby globstaren bash, lo que crea un guión ya más complicado. Tiendo a guardar globos para tareas grandes y complicadas, mientras que findla sintaxis es más fácil de unir sobre la marcha con solo unir un montón de filtros y comandos en una sola línea.
user5359531

@ user5359531 no se necesitan ni globstar ni dotglob (a menos que sepa que tiene archivos ocultos y realmente los quiere) aquí. Obviamente, esto es una cuestión de opinión, pero usted es la primera persona con la que me he encontrado y considera que el formato más obtuso es más findsimple. Siempre prefiero los globs, findya que no solo los encuentro mucho más simples, sino que también son más seguros cuando se trata de nombres de archivos arbitrarios que se pasan a otros programas.
terdon

6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

He agregado -type dsi solo se trata de directorios.


Me cito {}, al menos ensvnadmin verify {}
kos

Gracias por la respuesta rápida. Entonces, en este comando, ¿ -execgenera un shell hijo, en el que se ejecutan los 2 comandos, ;como el final de la línea?
Arronical

5

Prueba 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

Bien, pero esto también procesará archivos: for f in */procesará solo directorios
kos

¿Esto solo funcionará en un script? ¿O puedo emitirlo en la línea de comando?
Arronical

1
@Arronical funcionará también como línea de comando
Maythux

2
  • Use en . -maxdepth 1lugar de ./*, solo necesita el primer nivel en la estructura de carpetas
  • Uso -type d, solo necesitas carpetas
  • Uso ! -name ".", no necesitas.
  • Úselo -execpara iniciar un shell
  • Use sh -cpara iniciar comandos dentro del shell

Su comando

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

o más corto

  • Úselo -prunesi el archivo es un directorio, no descienda a él

Su comando

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 

-pruneparece interesante. Solía ./* -maxdepth 0evitar regresar .del comando find. No causa ningún error crítico, pero prefiero no tener eso en mi salida.
Arronical

1

findtiene banderas de opciones 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, findpermite usar múltiples -execdeclaraciones. Esto significa que podríamos optar por usar:

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

Una vez más, nota que este enfoque es aplicable no sólo a la impresión con echo, printfu otros servicios públicos, sino también a otros comandos.


0

Puede ser útil canalizar la findsalida al readbucle:

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

Le permite ejecutar una secuencia de comandos compuesta más complicada con nombres de archivo devueltos por find, como en este elegante lsejemplo:

find . | while read f; do echo ${f} | figlet -k; done

-1

Esto imprimirá el nombre y el contenido de los archivos solo de forma recursiva.

find . -type f -printf '\n\n%p:\n' -exec cat {} \;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.