Copiar archivos con cp y xargs

Posted on the March 2nd, 2009 under GNU/Linux by Carlos Narez

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.

Artículos Relacionados

7 Responses to “Copiar archivos con cp y xargs”

  1. El Guille says:

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

    saludos! ..

  2. CARlos NARez says:

    Linux Rules !

  3. Armando Santos Villalobos says:

    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.

  4. Armando Santos Villalobos says:

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

  5. Armando Santos Villalobos says:

    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

  6. Armando Santos Villalobos says:

    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

  7. CARlos NARez says:

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

Deja tu comentario