É possível comparar dois diretórios com o rsync e imprimir apenas as diferenças? Existe uma opção de execução a seco, mas quando eu aumento a verbosidade para um determinado nível, todos os arquivos comparados são mostrados.
ls -alR
e diff
não há opção aqui, já que existem hardlinks na fonte que tornam cada linha diferente. (Obviamente, eu poderia excluir esta coluna com perl.)
directory
rsync
file-comparison
chris
fonte
fonte
Respostas:
Você provavelmente terá que executar algo como
rsync -avun --delete
nas duas direções.Mas o que você está realmente tentando realizar?
Atualização :
rsync -avun --delete $TARGET $SOURCE |grep "^deleting "
fornecerá uma lista de arquivos que não existem no diretório de destino."grep delet" porque cada linha é impressa: excluindo um arquivo ..
rsync -avun $SOURCE $TARGET
fornecerá uma lista de arquivos "diferentes" (incluindo novos arquivos).fonte
Para adicionar à resposta de Nils (para quem se deparar com isso através do Google), por padrão,
rsync
apenas compara os tamanhos dos arquivos e os tempos de modificação para saber se existem diferenças. (Se são diferentes, faz mais, mas se são iguais, para por aí.)Se você quiser comparar o conteúdo real do arquivo , mesmo para arquivos que tenham o mesmo tamanho e a hora da última modificação, adicione o sinalizador
-c
para indicarrsync
para comparar os arquivos usando uma soma de verificação.(A
-u
opção diz ao rsync para ignorar os arquivos mais recentes$TARGET
que os ativados$SOURCE
, o que você provavelmente não deseja se estiver comparando conteúdo.)fonte
--no-group --no-owner --no-perms --no-times
ou alguma combinação destes com base em suas necessidades.-a
em vez de-a
, por exemplorsync -rlDcnv --delete $SOURCE $TARGET
--delete
à lista os arquivos existentes apenas em$TARGET
Apenas para aqueles menos familiarizados com
rsync
:-n
: parte mais importante - não mude nada;-rc
: compare apenas o conteúdo (caso contrário, use-ac
);-v
: lista os arquivos)--delete
: procure uma diferença simétrica, não unidirecional./
significa "olhar dentro do diretório e comparar seu conteúdo com o destino".PS. Eu sei que é um PS terrível - mas foi realmente adicionado rapidamente. No entanto, aposto que podemos achar isso útil.
PPS. Como alternativa, também se poderia fazer
Se os nomes de arquivos não contiverem novas linhas, podemos classificar os dois
*.md5
arquivos ediff
eles. (Porém, isso funcionará apenas para arquivos; ou seja, um diretório vazio em ambos os lados não será detectado.)fonte
Surpreendentemente, nenhuma resposta em 6 anos usa a
-i
opção ou fornece resultados agradáveis, então aqui vou eu:TLDR - Apenas me mostre os comandos
Entendendo a saída
Aqui está um exemplo da saída:
Observe o primeiro caractere de cada linha:
L
/R
significa que o arquivo / dir aparece apenas no diretórioL
eft ouR
ight.X
significa que o arquivo aparece em ambos os lados, mas não é o mesmo (caso em que os próximos 11 caracteres dar mais informações.s
,t
ep
detectar diferenças nas s ize, t ime e p ermissions respectivamente - para mais informações tentarman rsync
e procurar--itemize-changes
) .Opções extras que você pode querer usar
Se você também quiser comparar o proprietário / grupo / permissões dos arquivos, adicione as opções
-o
/-g
/-p
respectivamente. Por fim, observe que, por padrão, o rsync considera dois arquivos iguais, se eles tiverem o mesmo nome, hora e tamanho. Isso é extremamente rápido e, na maioria das vezes, mais do que suficiente, mas se você quiser ter 100% de certeza, adicione-c
também para comparar o conteúdo dos arquivos com o mesmo nome, hora e tamanho.TLDR - Apenas me dê um script para ligar
Aqui está. Chame assim
Todas as opções mencionadas acima na seção "Opções extras que você deseja usar" também se aplicam aqui.
Como funciona?
Estamos chamando o rsync assim:
Usamos
-i
(--itemize-changes
) para dizer ao rsync para imprimir uma linha de saída para cada arquivo que contém informações sobre quaisquer diferenças entre os dois diretórios. Precisamos-n
suprimir o comportamento normal do rsync (que é tentar sincronizar os dois diretórios, copiando / excluindo arquivos). também precisamos-r
trabalhar recursivamente para todos os arquivos / subdiretórios.Chamamos rsync três vezes:
1ª chamada : imprima arquivos que não existem no Dir_B. Precisamos usar
--ignore-existing
para ignorar arquivos que existem nos dois lados.2ª chamada : exatamente como antes, mas trocamos a ordem de DIR_A / DIR_B.
3ª chamada : Finalmente, usamos
--existing
apenas para verificar os arquivos que aparecem nos dois diretórios.fonte
--rsync-path="sudo rsync"
a todos os comandos do rsync. Segundo, eu queria comparar o diretório local com o diretório remoto. Eu adicionei--rsh "ssh -p1234"
porque no meu caso o SSH está sendo executado na porta 1234. Então chamei o script likediff-dirs [email protected]:/mnt/Vol1/dir1/ /localMnt/dir1 -c
.Entendo pela sua pergunta que você não deseja usar o diff on ls , mas também pode usar o diff recursivamente nos diretórios:
fonte
Levei algumas tentativas para que isso funcionasse. A resposta de Nils exige que
$TARGET
termine em um final/
, conforme explicado por ジ ョ ー ジ.Aqui está uma versão que adiciona explicitamente o final
/
:Isso fornece a lista de arquivos que existem abaixo do
${SOURCE}
diretório, mas não abaixo do${TARGET}
diretório.Eu uso
sed
aqui para remover o líderdeleting
das linhas de saída e imprimir apenas essas linhas.Eu não uso a
rsync
opção-c
porque comparar o conteúdo do arquivo seria muito mais lento para meus casos de uso, e comparar apenas tamanhos de arquivo e tempos de modificação também parece suficiente nesses casos. Não tenho motivos para suspeitar que meus computadores sofram de problemas de inclinação do relógio ou que algo alterou maliciosamente os carimbos de hora. Além disso, o resultado de-c
não pode alterar a decisão de excluir um arquivo, apenas a decisão de atualizar ou manter um arquivo.Também uso
-u
e-a
(em vez de-r
), para poder reutilizar a linha de comando posteriormente e alterá-la para copiar diretórios e arquivos selecionados de${SOURCE}
para${TARGET}
, assim:fonte
Eu tenho outra idéia de fazer isso:
Você pode combinar "FILEDETAIL ::" com a saída do comando. Além disso, você pode alterar a string "FILEDETAIL ::". O "% n" é o nome do arquivo.
-r Isso diz ao rsync para copiar diretórios recursivamente.
-n Isso faz com que o rsync execute uma execução de avaliação que não faça nenhuma alteração.
fonte