Copiar archivos con cp y xargs
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.











genial :-P …. find, awk, xargs y muchos otros hacen de la consola de linux lo mejor d elo mejor …
saludos! ..
Linux Rules !
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.
nop,, corrijo, esa linea que postié tampoco hace lo que quiero,, pero la encontraré y la postearé…
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
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
Excelente tu aporte @Armando, nos cuentas cuando lo logres, seguro en alguna ocación nos va a servir.