¿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
execgenerará resultados a medida que se encuentren, mientrasxargsque, 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 quexargsno está funcionando, se recomienda tener paciencia.-print0find 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
cmdmenor número de veces posible, a diferencia deexec, que se ejecutacmduna 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 (
-print0hace que sefindimpriman coincidencias terminadas en NUL,-0hacexargsesperar este formato).fuente
xargsenfoque es significativamente más lento si no hay (o solo unos pocos) archivos coincidentes ycmdno hay mucho que hacer para cada archivo. Por ejemplo, cuando se ejecuta en un directorio vacío, laxargsversió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
xargsversiones 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 … -execy… | xargsfuente