desarrollo-web-br-bd.com

¿Cómo copiar-fusionar dos directorios?

Tengo dos directorios de imágenes e imágenes2 con esta estructura en Linux:

/images/ad  
/images/fe  
/images/foo  

... y otras 4000 carpetas

y el otro es como:

/images2/ad  
/images2/fe  
/images2/foo

... y otras 4000 carpetas

Cada una de estas carpetas contiene imágenes y los nombres de los directorios bajo imágenes e imágenes2 son exactamente iguales, sin embargo, su contenido es diferente. Entonces quiero saber cómo puedo copiar-fusionar las imágenes de/images2/ad en images/ad, las imágenes de/images2/foo en images/foo y así sucesivamente con todas las 4000 carpetas.

126
ssierral

Este es un trabajo para rsync . No es beneficioso hacer esto manualmente con un bucle de Shell a menos que desee mover el archivo en lugar de copiarlo.

rsync -a /path/to/source/ /path/to/destination

En tu caso:

rsync -a /images2/ /images/

(Observe la barra inclinada final en images2, de lo contrario se copiaría a /images/images2.)

Si existen imágenes con el mismo nombre en ambos directorios, el comando anterior sobrescribirá /images/SOMEPATH/SOMEFILE con /images2/SOMEPATH/SOMEFILE. Si solo desea reemplazar archivos antiguos, agregue la opción -u. Si desea mantener siempre la versión en /images, agregue la opción --ignore-existing.

Si desea mover los archivos de /images2, con rsync, puede pasar la opción --remove-source-files. Luego, rsync copia todos los archivos a su vez y elimina cada archivo cuando está listo. Esto es mucho más lento que moverse si los directorios de origen y destino están en el mismo sistema de archivos.

La mejor opción, como ya se publicó, es por supuesto rsync. Sin embargo, también el unísono sería una gran pieza de software para hacer este trabajo. Ambos se pueden usar en varios sistemas operativos.

Rsync

rsync se sincroniza en una dirección desde el origen hasta el destino. Por lo tanto, la siguiente declaración

rsync -avh --progress Source Destination

sincroniza todo desde Origen hasta Destino . La carpeta fusionada reside en Destino .

- a significa "archivo" y copia todo de forma recursiva desde el origen al destino, conservando casi todo.

- v da más resultados ("detallado").

- h para lectura humana.

- progreso para mostrar cuánto trabajo se realiza.

Si solo desea actualizar la carpeta de destino con archivos más nuevos de la carpeta de origen:

rsync -avhu --progress source destination

Unísono

el unísono se sincroniza en ambas direcciones. Por lo tanto, la siguiente declaración

unison Source Destination

sincroniza ambos directorios en ambas direcciones y finalmente origen es igual a destino. Es como hacer rsync dos veces desde el origen hasta el destino y viceversa.

Para usos más avanzados, consulte las páginas de manual o los siguientes sitios web:

  1. https://www.cis.upenn.edu/~bcpierce/unison/
  2. https://rsync.samba.org/
46
debiarch
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done

Recorre todo el contenido de images2 usando un globo expandido (para evitar los problemas con el análisis ls) luego mv el contenido de esos elementos a la entrada correspondiente en images. Utiliza basename para despojar a los principales images2 desde el camino lleno de globos.

5
Etan Reisner

@ inulinux12, puede usar la siguiente línea for loop desde la línea de comandos:

$ for dir in images2/*; do mv "$dir"/* "${dir/2/}"; done

Esto moverá todos los archivos de images2 a images en sus respectivos directorios. Nota: esto supone que ningún archivo tiene el mismo nombre.

Por ejemplo:

Antes de la ejecución:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2
images/adfoo:
jpg.7
images/fe:
jpg.5
images2:
ad  adfoo  fe
images2/ad:
jpg.3
images2/adfoo:
jpg.6
images2/fe:
jpg.4

Después de la ejecución:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2  jpg.3
images/adfoo:
jpg.6  jpg.7
images/fe:
jpg.4  jpg.5
1
Simply_Me