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/SOMEFILE
con/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
images2
uso de un globo expandido (para evitar los problemas con el análisisls
) y luegomv
el contenido de esos elementos en la entrada correspondienteimages
. Utilizabasename
para despojar al líderimages2
de la ruta global.fuente
@ inulinux12, puede usar el siguiente
for
bucle de una línea desde la línea de comandos:Esto moverá todos los archivos de
images2
aimages
en 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/ParsingLsbasename
en esta situación particular (no es necesario llamarbasename
para esto). Gracias de nuevo por los comentarios constructivos.