Executando o ubuntu 12.04, quero comparar 2 diretórios, digamos folder1 / e folder2 / e copiar todos os arquivos diferentes da pasta3 /. Também existem arquivos aninhados, portanto, os subdiretórios correspondentes também devem ser copiados
Existe um único comando que me ajudaria? Posso obter a lista completa dos arquivos alterados em execução:
rsync -rcnC --out-format="%f" folder1/ folder2/
Mas o rsync parece não ter a capacidade de "exportar" esses arquivos em um diretório de destino diferente. Posso canalizar a lista para cp ou algum outro programa, para que os arquivos sejam copiados, enquanto os diretórios também são criados? Por exemplo, eu tentei
rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/
mas isso não preservaria os diretórios também, simplesmente copiaria todos os arquivos dentro da pasta3 /
diff -qr
eawk
para construir a lista, entãorsync
...rsync --include-from=FILE
opçãoRespostas:
Use --compare-dest.
Na página do manual:
primeiro verifique sua sintaxe com --dry-run
Então, quando estiver satisfeito com a saída:
este link tem uma boa explicação do escopo --compare-dest.
fonte
rsync -rcC --compare-dest=folder2/ folder1/ folder3/
rsync version 3.1.1 protocol version 31
no meu local e rsync não entende~/
caminhos para--compare-dest
param.--compare-dest
exigia um caminho absoluto.fonts/Makefile.in
arquivo, que é idêntico nos doisfolder2
e nosfolder1
diretórios.Este pequeno script deve funcionar:
Mas também acho que analisar a saída do diff -qr seria uma solução melhor, pois fornece o caminho e o nome de cada arquivo de forma consistente.
EDITAR
Este seria um comando, seu comando ligeiramente modificado. Mas isso criará
folder1
sob ofolder3
. E ele não funciona com caminhos completos, mas também o script acima não funciona com caminhos completos.I utilizado
\"
emrsync
fazê-lo funcionar com arquivos e diretórios contendo espaços em branco. Testado no Ubuntu 10.04. Espero que ajude.fonte
Essa é a forma mais simples que eu poderia criar, se você estiver disposto a descer
folder1
antes de emitir o comando.Esta é a opção mais lenta , mas acredito que ela atende aos seus requisitos e pode ser executada usando nomes de diretório não relativos:
Deixei seu
rsync
comando original sozinho, porque você disse que estava fornecendo a lista de arquivos correta (e meus arquivos de teste são obviamente diferentes dos seus, portanto, não podia ter certeza de que estaria obtendo a lista de arquivos correta se eu estragasse com isso).O
grep
que há para remover nomes de diretório a partir da saídarsync
.A saída de
grep
é então canalizada para outrarsync
utilizaçãoxargs
. No parâmetro,folder1/./{}
o extra./
é usado para dizer ao rsync para criar os diretórios relativos começando por./{}
ignorarfolder1/
. Em outras palavras, evita a criaçãofolder3/folder1/
.Eu só pude testar isso no CentOS 6.4, mas o AFAIK deve funcionar da mesma maneira no Ubuntu 12.04.
EDIT: Devo observar que a resposta do smithian é sem dúvida melhor, mas eu queria tentar fazê-lo com o seu
rsync
comando original no tato, pois estava fornecendo a saída desejada.fonte