Por que o rsync dry-run está listando alguns diretórios e não outros?

0

Estou tentando entender a saída de rsync -n --update -av dir1/ dir2/ . Foi-me dito que isso deveria listar todos os diretórios, além de arquivos que não existem em dir2 ou são mais recentes em dir1 . Eu tentei isso em um diretório de teste:

test
test/testDir1
test/testDir1/testDir11
test/testDir1/testDir11/testFile3.txt
test/testDir1/testFile2.txt
test/testFile1.txt
test/testDir2

Se eu copiar isso para testCopy , altere test/testDir1/testFile2.txt e, em seguida, execute rsync -n --update -av test/ testCopy/ , a saída é:

./
testDir1/
testDir1/testFile2.txt
testDir1/testDir11/
testDir2/

Qual é o que eu esperaria com base no que me foi dito sobre como a saída deve se comportar.

No entanto , eu tentei este mesmo comando em outros pares muito maiores de diretórios reais, obtendo um comportamento muito diferente. Tome dois exemplos de pares de diretórios que devem ser sincronizados:

  • Em um caso, a saída é meramente ./ , apesar do fato de haver muitos diretórios (620) e arquivos. Nenhum arquivo está listado.

  • Por outro lado, alguns diretórios (7/72) são listados. Nenhum arquivo está listado.

O que não estou entendendo sobre o que esta saída está me mostrando?

    
por Evan 22.06.2017 / 14:07

2 respostas

1

Embora eu não tenha documentação definitiva para apontar, isso é o que eu acho que está acontecendo.

Com -v|--verbose , os arquivos que devem ser transferidos (ou que seriam transferidos quando -n|--dry-run foi especificado) são listados. Os diretórios são apenas arquivos em SOs semelhantes ao Unix e estão listados nas mesmas regras.

Então, quando os diretórios são transferidos? (Além de quando eles não existem no alvo, obviamente.) Supondo que você especifique -t|--times (que é implícito por -a ), eles serão transferidos quando seus timestamps mudarem. Regras semelhantes se seus atributos foram alterados.

E quando os diretórios alteram os timestamps? Por observação, isso é (pelo menos) quando um arquivo no diretório é criado ou renomeado, mas não quando um arquivo apenas muda seus atributos, por exemplo, seu tempo.

Portanto, se você usar touch de um novo arquivo em testDir11 , testDir11 mudará o registro de data e hora e se tornará transferível. Mas se você touch um arquivo existente, o diretório não muda.

    
por 22.06.2017 / 14:58
2

Linha de fundo:

  1. Uma cópia (o comando cp ) faz um trabalho diferente do rsync. Por um lado, não copia os timestamps.

  2. A rsync option --update atualizará apenas os arquivos mais recentes.

Supondo que o que você fez foi uma cópia dos diretórios, em específico, isso:

#!/bin/bash

mkdir -p test/testDir2
mkdir -p test/testDir1/testDir11
echo "yes3" > test/testDir1/testDir11/testFile3.txt
echo "yes2" > test/testDir1/testFile2.txt
echo "yes1" > test/testFile1.txt

sleep 3
cp -r test/ testcopy/

Isso criará dois diretórios com estrutura semelhante:

$ tree test
test
├── testDir1
│   ├── testDir11
│   │   └── testFile3.txt
│   └── testFile2.txt
├── testDir2
└── testFile1.txt

E a cópia:

$ tree testCopy/
testCopy/
├── testDir1
│   ├── testDir11
│   │   └── testFile3.txt
│   └── testFile2.txt
├── testDir2
└── testFile1.txt

Os diretórios parecem iguais, mas não são. O sleep 3 antes do cp fará todos os arquivos em testCopy com tempos diferentes:

$ ls -la --time-style=full-iso test/testFile1.txt
-rw-r--r-- 1 user user 5 2017-06-22 20:22:13.704512555 0000 test/testFile1.txt

$ ls -la --time-style=full-iso testCopy/testFile1.txt
-rw-r--r-- 1 user user 5 2017-06-22 20:22:16.716355225 0000 testCopy/testFile1.txt

Em seguida, testar o rsync com as opções que você afirmou (nada será alterado) mostrará isso:

$ rsync -n --update -va test/ testCopy/
sending incremental file list
./
testDir1/
testDir1/testDir11/
testDir2/

Por que isso acontece?

Porque a opção --update tem precedência e só sincronizará novos arquivos. Os arquivos na cópia são mais recentes que os originais.

Se tocarmos em um arquivo no diretório original, ele será incluído:

$ touch test/testFile1.txt
$ rsync -n --update -va test/ testCopy/
sending incremental file list
./
testFile1.txt
testDir1/
testDir1/testDir11/
testDir2/

O que fará uma sincronização completa (mais antiga ou mais recente, mas diferente):

$ rsync -n -va test/ testCopy/
sending incremental file list
./
testFile1.txt
testDir1/
testDir1/testFile2.txt
testDir1/testDir11/
testDir1/testDir11/testFile3.txt
testDir2/

Se isso for permitido para executar a sincronização (remova a opção -n ) e execute novamente:

$ rsync -n -va test/ testCopy/
sending incremental file list

Nada precisa ser trocado quando tudo foi atualizado.

Se um arquivo for alterado (torná-lo mais recente), ele será atualizado:

$ touch test/testDir1/testFile2.txt
$ rsync -n --update -va test/ testCopy/
sending incremental file list
testDir1/testFile2.txt

Mas depois de uma sincronização real, se o arquivo feito mais recente for o da cópia. ele não precisará ser trocado (já é mais recente).

$ touch testCopy/testDir1/testFile2.txt
$ rsync -n --update -va test/ testCopy/
sending incremental file list
    
por 23.06.2017 / 03:06

Tags