Ver Mensaje Individual
  #2 (permalink)  
Antiguo 24/09/2014, 08:25
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: copiar ficheros LINUX

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 original
  1. find . [filtros] -exec 'bash -c "
  2.    # bloque de código
  3. " {}

O su variante con xargs:
Código BASH:
Ver original
  1. find . [filtros] -print0 | xargs -0 'bash -c "
  2.    # bloque de código
  3. "

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 original
  1. DIR_ORIGEN=/ruta1
  2. DIR_DESTINO=/ruta2
  3. I=0
  4. ARCHIVOS_POR_VEZ=50
  5. PAUSA=15
  6.  
  7. cd "$DIR_ORIGEN"
  8. find . -type f > listado.txt
  9. while read ARCHIVO; do
  10.     DIR_DESTINO_ARCHIVO=$(dirname "$ARCHIVO")
  11.     mkdir -p "$DIR_DESTINO_ARCHIVO" # crea el directorio destino si no existe
  12.     cp -av -- "$ARCHIVO" "$DIR_DESTINO/"
  13.  
  14.     I=$(( I + 1 ))
  15.     if (( I % ARCHIVOS_POR_VEZ )); then
  16.         sleep $PAUSA
  17.     fi
  18. 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 original
  1. DIR_ORIGEN=/ruta1
  2. DIR_DESTINO=/ruta2
  3. I=0
  4. ARCHIVOS_POR_VEZ=50
  5. PAUSA=15; export PAUSA
  6.  
  7. cd "$DIR_ORIGEN"
  8. find . -type f -print0 | xargs -0 -n $ARCHIVOS_POR_VEZ 'bash -c "
  9.    for ARCHIVO in $0 $*; do
  10.        DIR_DESTINO_ARCHIVO=$(dirname "$ARCHIVO")
  11.        mkdir -p "$DIR_DESTINO_ARCHIVO" # crea el directorio destino si no existe
  12.        cp -av -- "$ARCHIVO" "$DIR_DESTINO/"
  13.    done
  14.    sleep $PAUSA
  15. "