Mesclar pastas e substituir arquivos usando o CLI

9

Eu quero atualizar alguns softwares de fórum e gostaria de testar o processo de atualização usando o CLI como uma possibilidade de aprendizado.

Como faço para mesclar o conteúdo de uma pasta em outra pasta e substituir arquivos?

    
por user46165 30.08.2013 / 01:45

2 respostas

10

Você pode usar rsync para fazer isso:

$ rsync -abviuzP src/ dest/
  • -a modo de arquivamento; é igual a -rlptgoD (não -H, -A, -X)
  • -i ativa o formato discriminado, que mostra mais informações do que o formato padrão
  • -b cria arquivos de backup rsync que existem nas duas pastas, anexando ~ ao arquivo antigo. Você pode controlar este sufixo com --suffix .suf
  • -u faz a transferência rsync pular arquivos que são mais recentes no dest do que no src
  • -z ativa a compactação, o que é útil ao transferir arquivos facilmente compactáveis em links lentos
  • -P ativa --partial e --progress
    • --partial faz o rsync manter arquivos parcialmente transferidos se a transferência for interrompida
    • --progress mostra uma barra de progresso para cada transferência, útil se você transferir arquivos grandes

Eu abandonaria vários desses switches, mas isso é só para você começar. Eu provavelmente usaria algo assim:

$ rsync -abuP src/ dest/

Uma vez que parece OK, você pode executar este comando para remover os arquivos de backup:

$ find dest/ -name "*.~" -delete

Exemplo

Vamos fingir que temos os seguintes dados de amostra.

dados originais

Usaremos os seguintes comandos para fabricar alguns dados falsos.

$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done

Os dados falsificados são os seguintes:

$ 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

novos dados

Agora replicaremos os dados originais ( dest/* - > src/ ) e adicionaremos alguns arquivos novos ao mix. Isso simula uma "nova versão.

$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done

Os dados falsificados são os seguintes:

$ 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

mescla src / into dest /

Isso simula que apenas configuramos nossa nova árvore de software em src/ e queremos mesclar em nosso diretório pré-existente, 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 você pode ver, os arquivos a seguir foram atualizados, file1, file3, file5, e o novo arquivo11 adicionado recentemente.

Como confirmação, podemos ver que os seguintes arquivos de backup foram criados por rsync quando encontrou os arquivos preexistentes em dest/ .

$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
    
por 30.08.2013 / 03:40
2

Você pode usar cp -r name_of_the_folder / * name_of_the_destination_folder onde o asterisco (*) representa todos os arquivos e -r para cópia recursiva.

Você também pode usar a opção -i, que perguntará se você deseja sobrescrever o conteúdo.

    
por 30.08.2013 / 02:27

Tags