Cria um arquivo zip de arquivos alterados em 2 diretórios

2

O que estou tentando fazer é criar um arquivo zip (ou algum arquivo diferente) que contenha todos os arquivos alterados de dois diretórios fornecidos. O caminho dos arquivos deve ser persistido no arquivo, então o arquivo pode funcionar como um patch.

Então, basicamente semelhante a:

diff -crN old_dir new_dir > pathfile

Mas, por conveniência, crie um arquivo zip contendo todos os arquivos alterados.

Existe uma solução padrão para isso ou eu precisaria criar meu próprio script para isso?

    
por Sander Roes 07.12.2012 / 10:46

2 respostas

2

Você pode listar arquivos modificados usando rsync :

rsync -rnc --log-format='%f' new_dir/ old_dir/
  • -r significa recursivo
  • -n significa executar uma execução de teste (sinônimo para --dry-run)
  • -c diz ao rsync para comparar o arquivo dependendo de sua soma de verificação
  • --log-format='%f' nos fornece nomes de arquivos (formato longo)

Isso lhe dará a lista de arquivos modificados em new_dir /

Você só precisa fornecer essa lista para zip :

zip patch.zip 'rsync -rnc --log-format='%f' new/ old/'

Observação se você fornecer o caminho completo ( /path/to/new/dir/ ) usando o formato de nome longo ( %f ), rsync retornará uma linha adicional ( /path/to/new/dir/. ). Se você usar o formato de nome abreviado ( %n ), rsync não retornará esta linha.

    
por 07.12.2012 / 12:28
1

Eu não quero pregar, mas a beleza de um ambiente * nix é a diversidade de ferramentas. Infelizmente eu não estou ciente de um pacote de software que faz o que você pede, mas isso pode ser feito com um script. Espero que este exemplo ajude você a escrever um roteiro desse tipo.

Temos algumas pastas com vários arquivos nelas (permutações de 0-5 x 0-5).

$ ls new/ |sort | column -x -c 50 | sed 's/\t/ /g'
00 01 02 03 04 05
10 11 12 13 14 15
20 21 22 23 24 25
30 31 32 33 34 35
40 41 42 43 44 45
50 51 52 53 54 55

Eu removi sete arquivos aleatórios de old e a pasta new tem 7 "novos" arquivos agora:

$ find . -type d -exec sh -c 'echo -n {} " "; ls {} |wc -l' \;
.  2
./new  36
./old  29

O Rsync (é uma ótima ferramenta para copiar arquivos e criar duas pastas semelhantes) pode isolar esses novos arquivos:

$ rsync --size-only --out-format=%f -rin new/ old/
new/05
new/15
new/21
new/22
new/35
new/54
new/55

Esses nomes de arquivos podem ser inseridos em uma ferramenta de arquivamento, como tar, depois de copie-os para um novo local :

$ mkdir diff/new
$ rsync -r --size-only --compare-dest=../../old/ new/  diff/new/
$ tar -C diff -czf diff.tar.gz .

E o conteúdo do arquivo são nossos novos arquivos:

$ tar tf diff.tar.gz
./
./new/
./new/55
./new/54
./new/35
./new/05
./new/22
./new/15
./new/21
    
por 07.12.2012 / 12:42

Tags