Zwykle robię to rsync -n
przed 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 rsync
by się stało , moim pomysłem byłoby pobranie tego wyniku, przetworzenie go, a następnie wytworzenie rsync
tylko --include-from
tego 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.
źródło
--dry-run
polecenia 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
.rsync --include-from include.txt --exclude=* SOURCE DEST
. Szczegółowe informacje można znaleźć na stronie stackoverflow.com/a/19296415/1765910 .rsync
ale nic nie wiem ze skryptów powłoki / bash…Odpowiedzi:
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:
Aby usunąć te linie, potokuj dane
rsync
wyjściowe dohead
i dotail
. 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,
rsync
aby użyć wygenerowanego pliku dołączeń (w razie potrzeby dodając dodatkowe opcje):rsync --include-from=include.txt --exclude=* source/ dest/
źródło
tail
/head
solidność jest wystarczająca, aby mieć tylko listę plików?--delete
powoduje 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
.rsync
interpretuje 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).