2012-04-30 12 views
7

Estaba pensando que algo así como lo que estoy tratando de lograr podría hacerse con herramientas de shell integradas sin la necesidad de un script más complicado.Copia recursiva en las rutas de destino relativas

Me gustaría encontrar todos los archivos en un camino y copiarlos en una ruta base de destino retener las rutas relativas que se encuentran en

Ejemplo:.

Decir que me encontré:

[~:] find /path/src \(-name "*.jpg" -o -name "*.gif" \) 

y que regresaron:

/path/src/a.jpg 
/path/src/dir1/b.jpg 
/path/src/dir2/dir3/c.gif 

me gustaría que todos terminan en:

/path/dest/a.jpg 
/path/dest/dir1/b.jpg 
/path/dest/dir2/dir3/c.gif 

he intentado una bandera -exec cp {} /path/dest \; a find pero que acaba de dejarle todo en/ruta/destino. Por ejemplo:

/path/dest/a.jpg 
/path/dest/b.jpg 
/path/dest/c.gif 
+0

Pertenece a http://superuser.com –

Respuesta

5

Puede usar rsync para esto, p.

$ rsync -av /path/src/ /path/dest/ --include \*/ --include \*.jpg --include \*.gif --exclude \* 

sólo para aclarar lo anterior:

-av    # recursive, copy attributes etc, verbose 
/path/src/  # source 
/path/dest/  # destination (NB: trailing/is important) 
--include \*/ # include all directories 
--include \*.jpg # include files ending .jpg 
--include \*.gif # include files ending .gif 
--exclude \*  # exclude all other files 
+0

¿Tiene habilidades para manejar esta situación? –

+0

Usted * podría * ser capaz de hacerlo con 'encontrar', pero parece que sería más trabajo y más propenso a errores, por lo que' rsync' es probablemente una herramienta mucho mejor para este trabajo en particular. –

8

En realidad también funciona con cp, lo que quiere es la bandera --parents.

cp --parents `find /path/src \(-name "*.jpg" -o -name "*.gif" \)` /path/target 

En teoría -P es sinónimos con --parents, pero que nunca funcionó para mí.

+1

Tu respuesta es correcta: '--parents' es la respuesta correcta. Sin embargo, '-P' es incorrecto (su significado es:' nunca seguir enlaces simbólicos en SOURCE' y es sinónimo de '--no-dereference' –

+1

Nota:' --parents' es una extensión de GNU a POSIX. –

+0

@CiroSantilli Buen punto. Pero, de nuevo, ¿cuántos sistemas conoce usted ** que se usan activamente ** no se basan en las convenciones GNU o GNU? [Incluso la implementación BSD cp es GNU] (http: //www.freebsd. org/cgi/man.cgi? query = cp & apropos = 0 & sektion = 1 & manpath = Red + Hat + Linux% 2Fi386 + 9 & format = html). – rioki

Cuestiones relacionadas