Ponownie użyj polecenia rsync --dry-run, aby przyspieszyć rzeczywisty transfer później


23

Zwykle robię to rsync -nprzed faktycznym wykonaniem rsync. Chodzi o to, jak mogę zautomatyzować drugi przebieg, aby ponownie wykorzystać dokładnie wygenerowaną listę --dry-run?

Mam na myśli, że jeśli uruchomię rsync -n, dostanę symulację tego, co rsyncby się stało , moim pomysłem byłoby pobranie tego wyniku, przetworzenie go, a następnie wytworzenie rsynctylko --include-fromtego wyniku, więc pełna lista musi zostać obliczona tylko raz.

Jeśli to nie ma sensu, proszę daj mi znać.

Nawiasem mówiąc, zwykle używam rsync -hva --progress --stats --delete --exclude-from "$EXCLUDEFILE". Jeśli masz również sugestię, jakich opcji byś użył, daj mi znać. Próbuję powielić zawartość zewnętrznego dysku twardego (który zawiera tylko obrazy, filmy i dokumenty) na inny zewnętrzny dysk twardy.


Możesz spróbować przekierować dane wyjściowe --dry-runpolecenia do pliku (np. rsync --dry-run -avz SOURCE DEST > include.txt), Usuwając wszystkie wiersze, które nie są plikami / ścieżkami z pliku include.txt, i uruchomić rsync --include-from include.txt.
ThatGuy,

To ostatnie polecenie powinno być rsync --include-from include.txt --exclude=* SOURCE DEST. Szczegółowe informacje można znaleźć na stronie stackoverflow.com/a/19296415/1765910 .
ThatGuy,

Tak, to jest pomysł, ale nie wiem, jak to zrobić (i chciałbym uzyskać zgodę kogoś, kto tak naprawdę wie, co robi). Po prostu używam, rsyncale nic nie wiem ze skryptów powłoki / bash…
Manuel,

Odpowiedzi:


18

Z pewnością możliwe jest użycie listy plików wygenerowanej podczas suchego przebiegu jako pliku dołączania. Najlepiej jednak usunąć dodatkowe wiersze u góry iu dołu wyjścia suchobiegu.

Przykładowe dane wyjściowe:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

Aby usunąć te linie, potokuj dane rsyncwyjściowe do headi do tail. Następnie zapisz przetworzone dane wyjściowe w pliku dołączanym:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

Na koniec powiedz, rsyncaby użyć wygenerowanego pliku dołączeń (w razie potrzeby dodając dodatkowe opcje):

rsync --include-from=include.txt --exclude=* source/ dest/


Problem polega na tym, że nie radzi sobie z plikami, które należy usunąć. Czy ta metoda tail/ headsolidność jest wystarczająca, aby mieć tylko listę plików?
Manuel

Dodanie --deletepowoduje również usunięcie plików z katalogów źródłowych z katalogów docelowych, przynajmniej na komputerze, na którym próbowałem. Możesz całkowicie pominąć część tail/ head. rsyncinterpretuje każdą linię w pliku dołączanym jako nazwę pliku i po prostu ignoruje nieistniejące pliki, więc nic się nie stanie, jeśli zachowasz dodatkowe linie (chyba że zdarzy się, że pliki będą miały nazwę „wysyłanie przyrostowej listy plików” itp., w takim przypadku te pliki również zostaną skopiowane).
ThatGuy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.