Hoy me toco copiar unos archivos de diferentes directorios hacia un directorio específico, después de horas de investigación y pruebas, les comento como lo realicé.

Si quieren copiar todos los archivos de un directorio y sus subdirectorios a otra ubicación lo pueden hacer con los siguientes comandos.

$ find . -iname "*foobar*" -exec cp "{}" ~/dirDestino ;

o este otro

$ find . -name "*.jpg" -print0 | xargs -t -0 -I xxx cp xxx ~/dirDestino

Pero si en su lugar ustedes tienen un archivo con las rutas (posiblemente resultado de otras verificaciones) como el siguiente

./dir1/47514.jpg
./dir2/11546.jpg
./dir2/11736.jpg
./dir3/80009.jpg
./dir3/80015.jpg

y esas rutas son las que quieren mandar como parámetros al cp en xargs lo pueden hacer agrando un caracter delimitador (en este caso un *) y luego enviarlo como parametro como se muestra a continuación.

$ awk '{printf $0"*"}' ejemplo.txt > ejemploConDelimitador.txt
$ cat ejemploConDelimitador.txt | xargs -t --delimiter=* -I xxx cp xxx ~/dirDestino

Listo! Esto resulta muy útil cuando se tratan de cientos de archivos. Espero que les sirva y si tienen alguna duda no se olviden de escribirla en los comentarios.

Tagged on:             

7 thoughts on “Copiar archivos con cp y xargs

  • March 2, 2009 at 8:56 pm
    Permalink

    genial 😛 …. find, awk, xargs y muchos otros hacen de la consola de linux lo mejor d elo mejor …

    saludos! ..

    Reply
  • April 5, 2009 at 8:22 am
    Permalink

    es buena la idea, pero tuve que modificarla para poder copiar con las rutas relativas, y lo unico que pude encontra fue:
    find /home/usuario -mtime -30 -print0 | xargs -0 cp -Rvfpd –target-directory=/home/backup

    con esto lo que trataba de hacer era hacer copias de archivos modificados los ultimos 30 dias.

    Reply
  • April 5, 2009 at 9:02 am
    Permalink

    nop,, corrijo, esa linea que postié tampoco hace lo que quiero,, pero la encontraré y la postearé…

    Reply
  • April 5, 2009 at 10:16 am
    Permalink

    definitivamente con cp no es el camino, porque el resultado de la busqueda siempre la copiara al directorio destino, sin preservar las rutas originales. Lo mejor para este caso sería copiar con rsync

    Reply
  • April 5, 2009 at 10:41 am
    Permalink

    ok, voy avanzando,, casi lo tengo, ahora necesito copiar la estructura de directorios antes de copiar el resultado de la busqueda… aca les dejo mi avance:

    find /home/e/ -mtime -30 -type f -print0 -ls | awk ‘{print$11}’ | while read line; do cp -u ${line} .${line};done | more

    Reply
  • April 5, 2009 at 12:58 pm
    Permalink

    Excelente tu aporte @Armando, nos cuentas cuando lo logres, seguro en alguna ocación nos va a servir.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *