Existe un límite máximo para la duración de una lista de argumentos para los comandos del sistema: este límite es específico de la distribución según el valor de MAX_ARG_PAGES
cuándo se compila el núcleo, y no se puede cambiar sin volver a compilar el núcleo.
Debido a la forma en que el shell maneja el globbing, esto afectará a la mayoría de los comandos del sistema cuando use el mismo argumento ("* .jpg"). Dado que el shell primero procesa el glob y luego lo envía al comando, el comando:
cp -uf *.jpg /targetdir/
es esencialmente lo mismo para el shell como si escribieras:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
Si está lidiando con muchos archivos JPEG, esto puede volverse inmanejable muy rápido. Dependiendo de su convención de nomenclatura y la cantidad de archivos que realmente tiene que procesar, puede ejecutar el comando cp en un subconjunto diferente del directorio a la vez:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
Esto podría funcionar, pero exactamente qué tan efectivo sería se basa en qué tan bien puede dividir su lista de archivos en convenientes bloques globbables.
Globbable Me gusta esa palabra
Algunos comandos, como find y xargs , pueden manejar grandes listas de archivos sin hacer listas de argumentos de gran tamaño.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
El argumento -exec ejecutará el resto de la línea de comando una vez para cada archivo encontrado por find , reemplazando el {} con cada nombre de archivo encontrado. Dado que el comando cp solo se ejecuta en un archivo a la vez, el límite de la lista de argumentos no es un problema.
Esto puede ser lento debido a que tiene que procesar cada archivo individualmente. Usar xargs podría proporcionar una solución más eficiente:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs puede tomar la lista completa de archivos provista por find y dividirla en listas de argumentos de tamaños manejables y ejecutar cp en cada una de esas sublistas.
Por supuesto, también existe la posibilidad de recompilar su kernel, estableciendo un valor mayor para MAX_ARG_PAGES
. Pero recompilar un kernel es más trabajo del que estoy dispuesto a explicar en esta respuesta.