Combinar carpetas y reemplazar archivos usando CLI

9

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?

usuario46165
fuente

Respuestas:

10

Puedes usar rsyncpara hacer esto:

$ rsync -abviuzP src/ dest/
  • -amodo 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
  • -bcrea 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 grandes

Dejarí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

Ejemplo

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 rsynccuando encontró los archivos preexistentes en dest/.

$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
slm
fuente
Para aclarar el punto anterior: una vez que se ve bien, puede ejecutar este comando para eliminar los archivos de copia de seguridad:> $ find dest / -name "start dot ~" -delete Esto no parece funcionar para mí, mientras que:> $ find dest / -name "start dot star ~" -delete hizo. ¡No estoy seguro de si eso es un error tipográfico o algo que no está configurado correctamente para mí!
2

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.

Spyros Chiotakis
fuente