Aquí iré apuntando las traperadas que hago para copiar archivos sobretodo en red.

  • Copiar archivos por red de un host a otro, teniendo en un archivo la lista de nombres. En el destino se copiarán todos los archivos en un único directorio. Esto lo uso mucho en el trabajo. Por ejemplo:
    cat fileNames.txt
    /copy/from/here/file1.txt
    /another/dir/file2.txt
    /file3.txt
    /home/user/file4.txt
    
    # in target host:
    cd /target/directory
    while [ 1 ]; do nc -l -p 1234|tar xvzf -; sleep 1; done
    
    # in source host:
    while read file; do cd `dirname $file`;tar cvzf - `basename $file` | netcat targetHost 1234; cd -; sleep 5; done <fileNames.txt

    De esta manera se comprimen y se mandan por red los archivos. Que quede claro que los archivos van a parar todos a un directorio:

    # in target host:
    cd /target/directory
    ls
    file1.txt
    file2.txt
    file3.txt
    file4.txt

    así que más vale que no se repitan nombres de archivos…

  • Copiar por red un árbol de directorios o múltiples archivos sueltos, con barra de progreso:
    # in source host:
    SOURCE="myfile1 mypattern*.ext /my/dir/1"
    tar cvf - $SOURCE | pv -s `du $SOURCE -cs|tail -1|awk '{print $1}'`K | gzip - | nc -l 8000
    
    # in target host/directory
    nc localhost 8000|gunzip -|tar xvf -
    

    Si se quiere quitar la barra de progreso o no se tiene el paquete ‘pv’:

    # in source host:
    SOURCE="myfile1 mypattern*.ext /my/dir/1"
    tar cvzf - $SOURCE | nc -l 8000
    
    # in target host/directory
    nc localhost 8000|tar xvzf -
    
  • Igual que antes, pero comprobamos MD5:
    # in source host:
    SOURCE="myfile1 mypattern*.ext /my/dir/1"
    tar cvf - $SOURCE 2>/tmp/listOfFiles.txt | pv -s `du $SOURCE -cs|tail -1|awk '{print $1}'`K | gzip - | nc -l 8000
    
    # in target host/directory
    nc localhost 8000|tar xvzf - >/tmp/listOfFiles.txt
    

    En «./listOfFiles.txt» tenemos la lista de archivos que se han copiado (en ambos equipos). Creamos un único md5 de todos los archivos:

    # exec in source and target host
    while read file; do [[ -e $file && ! -d $file ]] && md5sum "$file"; done 
    

    Ambos valores deben coincidir. Si no coinciden pues ya investigamos en detalle

  • Hacer un tar.gz con barra de progreso:
    tar -cf - . | pv -s $(du -sb . | awk '{print $1}') | gzip > out.tgz
Copiar archivos: tips and tricks

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *