Hay una longitud máxima de la lista de argumentos para un nuevo proceso en el sistema POSIX. find
dividirá la ejecución si las rutas de los archivos son más largas que esto. Para ver el límite en Linux, use xargs --show-limits
(no funcione en Mac OS, si alguien conoce una alternativa mejor, comente aquí)
editar: robado directamente de la respuesta de Gnouc, la forma POSIX para obtener la longitud máxima de la lista de argumentos es getconf ARG_MAX
. Sin embargo, realicé un experimento en mi máquina Mac OS, y parece que find
usa un poco más de la mitad de ese número. Esto es coherente con el hecho de que, en el sistema donde funciona, xargs --show-limits
nos dice que no usará la longitud máxima del argumento (en este caso también usará aproximadamente la mitad de ese número), sin embargo, no pude encontrar una explicación para eso.
editar 2: parece que la única forma confiable de determinar cuántos parámetros se find
mantendrán unidos para cada invocación es experimentar, por ejemplo ejecutando
find / -exec echo {} + | wc -cl
Como el resultado de find
tiene una línea para cada echo
invocación, es posible contarlos usando wc -l
. El número total de bytes echo
ed es la salida de en su wc -c
lugar. Al dividir uno por otro, obtiene el número promedio de bytes en los parámetros para cada invocación de comando (aunque un valor ligeramente menor, debido al redondeo, aproximadamente la mitad de la longitud promedio de una ruta en su sistema)
find / -exec echo | wc
y midiendo la relación entre el recuento de caracteres y el recuento de líneas. Encontré que la longitud máxima de la línea de comando utilizadafind
es significativamente menor que el límite teórico de POSIX, y mucho más cerca de laSize of command buffer we are actually using
línea en la salidaxargs --show-limits
. Esto es cierto para Linux y puede ser cierto para la implementación de Mac OSfind
, aunquexargs
no imprimirá el valor en Mac OS. ¿Alguna idea de por qué sucede esto?--show-limits
POSIX no especifica, la implementación de Mac OSxargs
no lo admite.find / -exec echo | wc
no funciona Recuerda queARG_MAX
devuelve bytes. Y es la longitud máxima de los argumentos a lasexec(3)
funciones.--show-limits
que no es POSIX, aunque esta no es la longitud máxima de argumento utilizada porfind
, que utiliza un valor más pequeño. No entiendo por qué dices quefind / -exec echo | wc
eso no funcionará: en mi opinión, es una buena manera de tener una estimación del valor real (y por lo que puedo ver, mejor que usarlogetconf ARG_MAX
). Además, mi sistema de archivos es principalmente, si no todo, caracteres ASCII, por lo que la cantidad de caracteres es aproximadamente la misma que la cantidad de bytes.find / -exec sh -c 'echo $@ | wc -c' _ {} +
isntead.find / -exec echo {} + | wc -lc