En mi experiencia, lo que puedo recomendar es que no temas dividir los problemas complejos en partes más simples.
'cp' no te ofrece una opción para limitar la cantidad de archivos, tampoco find o rsync. Por lo que la solución debe provenir de la shell.
En muchas ocasiones podemos hacer esto
Código BASH:
Ver originalfind . [filtros] -exec 'bash -c "
# bloque de código
" {}
O su variante con xargs:
Código BASH:
Ver originalfind . [filtros] -print0 | xargs -0 'bash -c "
# bloque de código
"
Debes tener en cuenta que en la mayoría de los casos, tener código legible y entendible es mejor que tener código eficiente e ingenioso. Por esto, te propongo dos soluciones, elige la que te resulte más clara:
Solución 1:
- Usa find para obtener el listado de archivos del directorio 1.
- Define una variable índice ($I).
- Usando un bucle while, lee la salida de find (o redirige la salida a un archivo y lee de ese archivo), incrementando $I cada vez.
- si $I es divisible entre 50, haz un "sleep 15"
Implementación posible (no probada):
Código BASH:
Ver originalDIR_ORIGEN=/ruta1
DIR_DESTINO=/ruta2
I=0
ARCHIVOS_POR_VEZ=50
PAUSA=15
cd "$DIR_ORIGEN"
find . -type f > listado.txt
while read ARCHIVO; do
DIR_DESTINO_ARCHIVO=$(dirname "$ARCHIVO")
mkdir -p "$DIR_DESTINO_ARCHIVO" # crea el directorio destino si no existe
cp -av -- "$ARCHIVO" "$DIR_DESTINO/"
I=$(( I + 1 ))
if (( I % ARCHIVOS_POR_VEZ )); then
sleep $PAUSA
fi
done < listado.txt
Solución 2:
- Usa find para obtener la lista de archivos del directorio
- Usa xargs con su opción '-n' para limitar la cantidad de argumentos que se pasan al programa
- Usa sleep 15 dentro del bloque para xargs.
Implementación posible (no probada):
Código BASH:
Ver originalDIR_ORIGEN=/ruta1
DIR_DESTINO=/ruta2
I=0
ARCHIVOS_POR_VEZ=50
PAUSA=15; export PAUSA
cd "$DIR_ORIGEN"
find . -type f -print0 | xargs -0 -n $ARCHIVOS_POR_VEZ 'bash -c "
for ARCHIVO in $0 $*; do
DIR_DESTINO_ARCHIVO=$(dirname "$ARCHIVO")
mkdir -p "$DIR_DESTINO_ARCHIVO" # crea el directorio destino si no existe
cp -av -- "$ARCHIVO" "$DIR_DESTINO/"
done
sleep $PAUSA
"