Quiero actualizar algún software de foro y me gustaría probar el proceso de actualización utilizando CLI como una posibilidad de aprendizaje.
¿Cómo fusiono el contenido de una carpeta en otra carpeta y reemplazo los archivos?
Puedes usar rsync
para hacer esto:
$ rsync -abviuzP src/ dest/
-a
modo de archivo; es igual a -rlptgoD (no -H, -A, -X)-i
activa el formato detallado, que muestra más información que el formato predeterminado-b
crea archivos de copia de seguridad rsync que existen en ambas carpetas, agregando ~ al archivo anterior. Puede controlar este sufijo con --suffix .suf-u
realiza archivos de omisión de transferencia rsync que son más nuevos en dest que en src-z
activa la compresión, que es útil cuando se transfieren archivos fácilmente comprimibles a través de enlaces lentos-P
enciende --partial y --progress
--partial
hace que rsync mantenga archivos parcialmente transferidos si la transferencia se interrumpe--progress
muestra una barra de progreso para cada transferencia, útil si transfiere archivos grandesDejaría caer varios de estos interruptores, pero esto es solo para comenzar. Probablemente usaría algo como esto:
$ rsync -abuP src/ dest/
Una vez que se ve bien, puede ejecutar este comando para eliminar los archivos de copia de seguridad:
$ find dest/ -name "*.~" -delete
Supongamos que tenemos los siguientes datos de muestra.
datos originales
Utilizaremos los siguientes comandos para fabricar algunos datos falsos.
$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done
Los datos falsos tienen el siguiente aspecto:
$ tree -DsifvF --noreport dest/
dest
[ 4096 Aug 29 22:21] dest/dir1/
[ 2 Aug 29 22:21] dest/dir1/file1
[ 4096 Aug 29 22:21] dest/dir2/
[ 2 Aug 29 22:21] dest/dir2/file2
[ 4096 Aug 29 22:21] dest/dir3/
[ 2 Aug 29 22:21] dest/dir3/file3
[ 4096 Aug 29 22:21] dest/dir4/
[ 2 Aug 29 22:21] dest/dir4/file4
[ 4096 Aug 29 22:21] dest/dir5/
[ 2 Aug 29 22:21] dest/dir5/file5
nuevos datos
Ahora replicaremos los datos originales ( dest/*
-> src/
) y agregaremos un par de archivos más nuevos a la mezcla. Esto simula una "nueva versión".
$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done
Los datos falsos tienen el siguiente aspecto:
$ tree -DsifvF --noreport src/
src
[ 4096 Aug 29 22:21] src/dir1/
[ 3 Aug 29 23:00] src/dir1/file1
[ 4096 Aug 29 22:21] src/dir2/
[ 2 Aug 29 22:21] src/dir2/file2
[ 4096 Aug 29 22:21] src/dir3/
[ 3 Aug 29 23:00] src/dir3/file3
[ 4096 Aug 29 22:21] src/dir4/
[ 2 Aug 29 22:21] src/dir4/file4
[ 4096 Aug 29 22:21] src/dir5/
[ 3 Aug 29 23:00] src/dir5/file5
[ 4096 Aug 29 23:00] src/dir11/
[ 5 Aug 29 23:00] src/dir11/file11
fusionar src / en dest /
Esto imita que acabamos de configurar nuestro nuevo árbol de software src/
y queremos fusionarnos en nuestro directorio preexistente dest/
.
$ rsync -abuP src/ dest/
sending incremental file list
dir1/file1
3 100% 0.00kB/s 0:00:00 (xfer#1, to-check=5/13)
dir11/
dir11/file11
5 100% 4.88kB/s 0:00:00 (xfer#2, to-check=4/13)
dir3/file3
3 100% 2.93kB/s 0:00:00 (xfer#3, to-check=2/13)
dir5/file5
3 100% 2.93kB/s 0:00:00 (xfer#4, to-check=0/13)
sent 416 bytes received 97 bytes 1026.00 bytes/sec
total size is 18 speedup is 0.04
Como puede ver, se actualizaron los siguientes archivos, archivo1, archivo3, archivo5 y el recién agregado dir11 + archivo11.
Y como confirmación, podemos ver que los siguientes archivos de copia de seguridad se crearon rsync
cuando encontró los archivos preexistentes en dest/
.
$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
Puede usar cp -r name_of_the_folder / * name_of_the_destination_folder donde el asterisco (*) representa todos los archivos y -r para copia recursiva.
También puede usar la opción -i que le preguntará si desea sobrescribir el contenido.
fuente