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.

Respuestas:
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.
En tu caso:
(Observe la barra inclinada final
images2, de lo contrario se copiaría/images/images2).Si existen imágenes con el mismo nombre en ambos directorios, el comando anterior se sobrescribirá
/images/SOMEPATH/SOMEFILEcon/images2/SOMEPATH/SOMEFILE. Si desea reemplazar solo archivos antiguos, agregue la opción-u. Si desea mantener siempre la versión/images, agregue la opción--ignore-existing.Si desea mover los archivos
/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.fuente
rsync, a continuaciónrm -r /images.rsync -a images images2, simplemente copiará images2 en imágenes en lugar de fusionarlas.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
sincroniza todo, desde el origen hasta el destino . La carpeta fusionada reside en Destino .
-a significa "archivo" y copia todo de forma recursiva desde el origen hasta el destino, preservando casi todo.
-v da más salida ("detallado").
-h para humanos legibles.
- Progreso para mostrar cuánto trabajo se realiza.
Si solo desea actualizar la carpeta de destino con los archivos más nuevos de la carpeta de origen:
Unísono
el unísono se sincroniza en ambas direcciones. Por lo tanto, la siguiente declaración
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:
fuente
rsync -avh --progress source/ destination/, de lo contrario, la carpeta de origen se creará en la carpeta de destino, al menos en mi caso así.Recorra todo el contenido del
images2uso de un globo expandido (para evitar los problemas con el análisisls) y luegomvel contenido de esos elementos en la entrada correspondienteimages. Utilizabasenamepara despojar al líderimages2de la ruta global.fuente
@ inulinux12, puede usar el siguiente
forbucle de una línea desde la línea de comandos:Esto moverá todos los archivos de
images2aimagesen sus respectivos directorios. Nota: esto supone que ningún archivo tiene el mismo nombre.Por ejemplo:
Antes de la ejecución:
Después de la ejecución:
fuente
ls. mywiki.wooledge.org/ParsingLsbasenameen esta situación particular (no es necesario llamarbasenamepara esto). Gracias de nuevo por los comentarios constructivos.