¿Cuál es más eficiente en un conjunto de archivos muy grande y debería usarse?
find . -exec cmd {} +
o
find . | xargs cmd
(Suponga que no hay personajes divertidos en los nombres de archivo)
linux
unix
command-line
find
dogbane
fuente
fuente
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í:
o
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.fuente
exec
generará resultados a medida que se encuentren, mientrasxargs
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 quexargs
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.es más eficiente (se ejecuta el
cmd
menor número de veces posible, a diferencia deexec
, que se ejecutacmd
una vez por cada partido). Sin embargo, tendrá problemas si los nombres de archivo contienen espacios o caracteres extravagantes.Se sugiere utilizar lo siguiente:
esto funcionará incluso si los nombres de archivo contienen caracteres extravagantes (
-print0
hace que sefind
impriman coincidencias terminadas en NUL,-0
hacexargs
esperar este formato).fuente
xargs
enfoque es significativamente más lento si no hay (o solo unos pocos) archivos coincidentes ycmd
no hay mucho que hacer para cada archivo. Por ejemplo, cuando se ejecuta en un directorio vacío, laxargs
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 ...)Las
xargs
versiones modernas a menudo admiten la ejecución de canalizaciones paralelas.Obviamente, podría ser un punto de inflexión cuando se trata de elegir entre
find … -exec
y… | xargs
fuente