Synchronizuj dwa foldery lokalne w bash

23

Mam jeden duży folder „X” w moim katalogu domowym i nieaktualną kopię tego na dysku flash - Y. Co to jest analog rm Y; cp X Y, ale bez zastępowania już istniejących plików?

Jofsey
źródło

Odpowiedzi:

26

Istnieje wiele właściwości więcej do rsync niż poprzednia odpowiedź wspomina. Powinieneś zajrzeć do nich sam:

man rsync

Ale dla twojego problemu sugerowałbym:

rsync -a --delete X Y

W ten sposób odbiornik (Y) usunie każdy plik, którego nie ma w X. Pamiętaj jednak, aby zrobić to dobrze. Niepoprawnie użyte, ponieważ root może łatwo zabić twój system ... :)

Mattias Åslund
źródło
1
Zgódź się, że powinieneś być bardzo ostrożny z tym. Spróbuj dodać --dry-run do polecenia, aby zobaczyć, co się stanie bez wprowadzania żadnych zmian. Jeśli pójdzie dobrze, wykonaj tę samą komendę bez --dry-run
squarecandy
Niewielka korekta że zajęło mi trochę czasu, aby dotrzeć: rsync -a --delete X/ Y. Ten mały slash po X sprawił, że działał on tak, jak powinien, więc może również pomóc innym. Wyjaśniono tutaj: abbeyworkshop.com/howto/unix/nix_rsync/index.html
Shovalt
15

Spójrz na rsync (1) . Ma to na celu robienie dokładnie tego, co chcesz.

rsync -av X Y

Obsługuje zdalne kopiowanie za pomocą własnego protokołu lub ssh, ale można go także używać lokalnie.

W zależności od dokładnego zachowania, które chcesz, możesz również przekazać tę --updateopcję. Dzięki temu rsync nie będzie nadpisywał plików, które już istnieją w celu i są nowsze niż te w źródle.

Jeśli chcesz usunąć dodatkowe pliki (tj. Pliki, które istnieją w Y, ale nie w X), możesz dodać --deleteopcję.

Kristof Provost
źródło
Ale nie usunie plików, niż usunięte w X, a rm Y; cp X Yzrobi to.
Aby usunąć pliki usunięte z X, użyj opcji --delete.
csonuryilmaz
0

Spróbuj użyć rsnyc, prawdopodobnie z następującą komendą:

rsync -avzu /home/x /y

-u = nie zastępuj pliku w miejscu docelowym, jeśli jest zmodyfikowany

bwDraco
źródło
Ale nie usunie plików, niż usunięte w X, a rm Y; cp X Yzrobi to.
0

Myślę, że niektóre funkcje, których szukasz w opcji -u (aktualizacja), faktycznie istnieją w tej opcji:

„--ignore-exist” - pomiń aktualizację plików, które istnieją w odbiorniku

promet
źródło