Foros del Web » Administración de Sistemas » Unix / Linux »

copiar ficheros LINUX

Estas en el tema de copiar ficheros LINUX en el foro de Unix / Linux en Foros del Web. Buenos dias, soy novato en esto de script y necesitoh hacer uno que mueve de 50 ficheros en 50 ficheros de un directorio a otro ...
  #1 (permalink)  
Antiguo 23/09/2014, 03:20
 
Fecha de Ingreso: septiembre-2014
Ubicación: madrid
Mensajes: 1
Antigüedad: 10 años, 2 meses
Puntos: 0
Información copiar ficheros LINUX

Buenos dias,

soy novato en esto de script y necesitoh hacer uno que mueve de 50 ficheros en 50 ficheros de un directorio a otro dentro de la misma manquina.

para copiarlos seria asi ¿no=?
#!/bin/bash
$dir_ini='/home/test/dir1/'
$dir_fin='/home/test/dir2/'

for file in `$dir_ini -d *` ; do
find . -name *.* -mtime -10 -exec cp $"file" $dir_fin {} ;
done

y para moverlos en un intervalo de 15 segundos de 50 ficheros en 50, ¿alguien podrria ayudarme?

gracias.
  #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. "

Etiquetas: ficheros, ip, linux
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:45.