Zaczynam i staram się rsync
go używać do synchronizacji dwóch folderów w systemie lokalnym. Mam folder źródłowy, którego zawartość zmienia się w czasie (niektóre pliki są dodawane, niektóre zmiany, a niektóre usuwane) oraz folder docelowy, który chcę prawie być lustrem źródła. Więc próbowałem użyć rsync w następujący sposób:
rsync -a --delete "${source_dir}" "${target_dir}";
Dzięki temu zawartość celu jest dokładnie taka sama jak zawartość źródła. Chciałbym jednak móc dodać niektóre pliki do celu, a nie źródła, ale nie chcę, aby były usuwane za każdym razem, gdy rsync. Z drugiej strony pliki, które były zsynchronizowane, a następnie usunięte w źródle, powinny być nadal usuwane.
Czy można to zrobić bez zmiany polecenia dla każdego pliku, który chcę wykluczyć?
Aktualizacja : Powinienem wspomnieć, że nie jestem ograniczony do rsync. Jeśli inny program wykona zadanie, to też dobrze. Właśnie próbowałem rozwiązać ten problem za pomocą rsync.
Odpowiedzi:
rsync
ma opcję o nazwie--exclude-from
opcja, która pozwala utworzyć plik zawierający listę plików, które chcesz wykluczyć. Możesz zaktualizować ten plik za każdym razem, gdy chcesz dodać nowe wykluczenie lub usunąć stary.Jeśli utworzysz plik wykluczenia za
/home/user/rsync_exclude
pomocą nowego polecenia, będzie to:Tworząc plik listy wykluczeń, każdą regułę wykluczeń należy umieścić w osobnym wierszu. Wyłączenia odnoszą się do katalogu źródłowego. Jeśli
/home/user/rsync_exclude
plik zawiera następujące opcje:secret_file
w katalogu źródłowym zostanie wykluczony.${source_dir}/first_dir/subdir
zostaną wykluczone, alesubdir
zsynchronizowana zostanie pusta wersja .${source_dir}/second_dir
z prefiksemcommon_name.
będą ignorowane. Takcommon_name.txt
,common_name.jpg
etc.źródło
Odkąd wspomniałeś: Nie jestem ograniczony do rsync:
Skrypt do utrzymywania kopii lustrzanej, umożliwiający dodawanie dodatkowych plików do celu
Poniżej skryptu, który robi dokładnie to, co opisujesz.
Skrypt można uruchomić w trybie pełnym (do ustawienia w skrypcie), który wyświetli postęp tworzenia kopii zapasowej (dublowanie). Nie trzeba dodawać, że można to również wykorzystać do rejestrowania kopii zapasowych:
Pełna opcja
Koncepcja
1. Przy pierwszej kopii zapasowej skrypt:
.recentfiles
2. W następnym i tak dalej na kopii zapasowej
.currentfiles
..recentfiles
(zestawienie sytuacji na poprzedniej kopii zapasowej) jest porównywane z.currentfiles
. Tylko pliki, z.recentfiles
których nie.currentfiles
ma, są oczywiście usuwane ze źródła i zostaną usunięte z obiektu docelowego..currentfiles
nazwa tymczasowa zostaje przemianowana.recentfiles
na następny cykl tworzenia kopii zapasowych i tak dalej.Scenariusz
Jak używać
backup_special.py
Zmień - jeśli chcesz - opcję pełną w nagłówku skryptu:
Uruchom go jako źródło i cel jako argumenty:
Prędkość
Przetestowałem skrypt w katalogu 10 GB z około 40 000 plików i katalogów na moim dysku sieciowym (NAS), dzięki czemu tworzenie kopii zapasowej nastąpiło prawie w tym samym czasie co rsync.
Aktualizacja całego katalogu zajęła tylko kilka sekund więcej niż rsync, na 40 000 plików, co jest niedopuszczalne i nie jest zaskoczeniem, ponieważ skrypt musi porównać zawartość z ostatnio wykonaną kopią zapasową.
źródło