Deja que xargs haga el cálculo por ti.
printf '%s\0' files/* | xargs -0 mv -t new_files_dir
Su pregunta parece asumir que hay un "límite de número de argumentos" real, mientras que en realidad es una combinación de dos límites:
-
la suma de las longitudes de cadena de los argumentos de la línea de comando y variables de entorno, incluidos sus bytes NUL de terminación.
-
la longitud máxima de cadena de un único argumento de línea de comandos.
Por ejemplo, puede llamar a un comando con 200000 argumentos de una sola letra, con 100000 argumentos de dos letras, pero no con un solo argumento de más de 128k bytes.
Asumiendo el xargs
de GNU coreutils, xargs --show-limits </dev/null
mostrará cuáles son esos límites en su sistema.
En cualquier sistema, xargs
no use los límites máximos de su sistema cuando construya líneas de comando, pero elija algo razonable (no tendría ningún sentido poner tensión en el sistema de esa manera).
Si realmente importa, podrías escribir tu propio batch-move
programa en C, que toma p. la lista de archivos como entrada estándar y hace el movimiento usando las llamadas del sistema Unix relevantes.
Si no, el "descubrir los límites y trabajar hasta eso" es exactamente qué xargs(1)
(Versión GNU en Linux, aquí) lo hace. Dudo mucho que llegues mucho más rápido.