Respuestas:
La diferencia de velocidad será insignificante.
Pero debes asegurarte de que:
Su secuencia de comandos no asumirá que ningún archivo tendrá espacio, tabulación, etc. en el nombre del archivo; la primera versión es segura, la segunda no.
Su secuencia de comandos no tratará un archivo que comience con " -
" como una opción.
Entonces su código debería verse así:
find . -exec cmd -option1 -option2 -- {} +
o
find . -print0 | xargs -0 cmd -option1 -option2 --
La primera versión es más corta y más fácil de escribir, ya que puede ignorar 1, pero la segunda versión es más portátil y segura, ya que " -exec cmd {} +
" es una opción relativamente nueva en GNU findutils (desde 2005, muchos sistemas en ejecución aún no la tendrán). y tenía errores recientemente . Además, mucha gente no sabe esto " -exec cmd {} +
", como puede ver en otras respuestas.
exec
generará resultados a medida que se encuentren, mientras xargs
que, al parecer, esperará hasta que se busque en todo el directorio antes de escribir en stdout. Si está probando esto en un directorio grande y parece que xargs
no está funcionando, se recomienda tener paciencia.
-print0
find devuelve nombres de archivo separados con una nueva línea, pero la nueva línea también puede ser parte de un nombre de archivo, lo que lo hace ambiguo. El byte 0 no puede, por lo que es un separador seguro. Sí, agregar --
a un comando que lo admita es una buena práctica cuando no puede controlar sus argumentos, incluso si no siempre es estrictamente necesario o no es seguro.
find . | xargs cmd
es más eficiente (se ejecuta el cmd
menor número de veces posible, a diferencia de exec
, que se ejecuta cmd
una vez por cada partido). Sin embargo, tendrá problemas si los nombres de archivo contienen espacios o caracteres extravagantes.
Se sugiere utilizar lo siguiente:
find . -print0 | xargs -0 cmd
esto funcionará incluso si los nombres de archivo contienen caracteres extravagantes ( -print0
hace que se find
impriman coincidencias terminadas en NUL, -0
hace xargs
esperar este formato).
xargs
enfoque es significativamente más lento si no hay (o solo unos pocos) archivos coincidentes y cmd
no hay mucho que hacer para cada archivo. Por ejemplo, cuando se ejecuta en un directorio vacío, la xargs
versión tardará al menos el doble de tiempo, ya que se deben iniciar dos procesos en lugar de solo uno. (Sí, la diferencia suele ser imperceptible en * nix, pero en un bucle podría ser importante; o, pruébelo en Windows alguna vez ...)