Parece que hay varias formas de hacerlo, incluidos los bucles en el script de shell, find y xargs. ¿Cuál de estos es el mejor y cuál es el más portátil?
Parece que hay varias formas de hacerlo, incluidos los bucles en el script de shell, find y xargs. ¿Cuál de estos es el mejor y cuál es el más portátil?
Respuestas:
find . -exec <command> {} \;
para el directorio actual como raíz del árbol o en general:
find <directory> -exec <command> {} \;
-name "*.c"
o por ejemplo -type d
para directorios ...
find ... | xargs ...
idioma, procesa los archivos en lotes, y esto generalmente será más rápido (menos procesos iniciados).
Use la -print0
opción para buscar y la -0
opción xargs
si tiene nombres de archivo o directorio con espacios:
find {dir} -print0 | xargs -0r {command}
La -print0
opción para buscar imprime los nombres de archivo como una NUL
lista separada por espacios en blanco en lugar de espacios en blanco, mientras que la -0
opción para xargs
indicar que rompa su entrada en NUL
lugar de espacios en blanco. Dado que NUL
es uno de los caracteres que no está permitido en los nombres de archivo Unix, no hay forma de que se confunda con parte de un nombre de archivo.
La -r
opción está ahí para que xargs
no le dé un error si no tiene entrada.
Si la portabilidad es un problema, me mantendría alejado de las formas específicas de hacerlo (hay muchas personas que usan muchos shells diferentes, pero en general find y xargs son herramientas realmente básicas que nadie se atrevería a cambiar de manera radical) .
El uso de argumentos básicos de find y xargs debería proporcionarle una solución más portátil.
Si la agrupación de argumentos es aceptable, busque | xargs probablemente dará un mejor rendimiento, ya que ejecutará el comando muchas menos veces que find -exec. Si desea ejecutar el comando cada vez para cada archivo o ejecutar en el subdirectorio del archivo, probablemente debería usar find -exec o -execdir.
Como regla general, es preferible mantenerse alejado de los bucles específicos de shell; find & xargs son suficientes para la mayoría de los escenarios.
Asegúrese de que la versión del comando que está utilizando no tenga una marca para la operación recursiva. :)