Jak zsynchronizować katalog z nowym katalogiem o innej nazwie?

49

Przesyłam dane, stary system plików opiera się głęboko na katalogu, który jest teraz na innej ścieżce. To jest katalog git, który przechowuje kod online. Nie mam prawa go przenosić ani zmieniać jego nazwy.

Mogę więc zsynchronizować ten katalog z tą samą starą ścieżką. Ale nazwa katalogu również się zmieniła.

Czy istnieje prosty sposób, aby zsynchronizować katalog z katalogiem docelowym o innej nazwie?

Zen
źródło

Odpowiedzi:

83

Jeśli chcesz użyć rsyncrekurencyjnie, aby destkatalog był dokładną kopią srckatalogu:

rsync -a src/ dest

rsyncStrona mężczyzna wyjaśnia, jak to działa:

Końcowy ukośnik [...] źródłowy pozwala uniknąć [...] utworzenia dodatkowego poziomu katalogu w miejscu docelowym. Możesz pomyśleć o trailing /w źródle, co oznacza „skopiuj zawartość tego katalogu” w przeciwieństwie do „skopiuj katalog według nazwy” [...]

Adrian
źródło
3
Spowoduje to utworzenie srckatalogu w destkatalogu
Zen
7
@Zen, nie w żadnej wersji, z rsyncktórej kiedykolwiek korzystałem. Jeśli tak się dzieje, brakuje ci ukośnika na końcu argumentu katalogu źródłowego.
Adrian
3
Ten podstępny ukośnik jest KLUCZOWY ...
tutuca
niestety nie wydaje się to działać, jeśli destjest to symlnk src, zamiast tego kończy się kopiowanie srcdo src/src. Testowane na macOS. Liczyłem, że mogę wymienić bar -> foo/z bar/, ale musiałem użyć pośredniego katalogu tymczasowego.
user5359531
@ user5359531 Jeśli wiesz, że destjest to dowiązanie symboliczne src, wystarczy rm desturuchomić powyższe polecenie. rsyncjest wystarczająco inteligentny, aby utworzyć destprzed skopiowaniem zawartości src. Nie potrzebujesz pośredniej temp. Reż.
Adrian
1

Jeśli stary i nowy system plików są dostępne dla twojego komputera, rozważ użycie dowiązania symbolicznego zamiast rsync. Jeśli używane polecenie rsync nie określa hostów (lub jeśli są one tym samym hostem), dzieje się tak. Próbujesz wykonać kopię lustrzaną dwóch katalogów o innej nazwie na tym samym hoście. Nie używaj do tego rsync, ponieważ kopiujesz dane i będziesz musiał często uruchamiać rsync, aby zachować synchronizację.

Użycie dowiązania symbolicznego jest jednorazową poprawką, która będzie odzwierciedlać dwa katalogi (o różnych nazwach) i nie wymaga prawie żadnego miejsca. To jak tworzenie katalogu aliasu, który wskazuje na inny katalog.

Załóżmy, że miałeś starego gita w katalogu o nazwie / old / path / old_git, a teraz repozytorium kodu zostało przeniesione do / new / path / new_git

Możesz to zrobić:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

Spowoduje to utworzenie takiego linku:

/ old / path / old_git -> / new / path / new_git

Tak więc wszystko, co zostanie wprowadzone do new_git, będzie natychmiast dostępne również w stary sposób, bez powielania danych i bez konieczności ciągłej synchronizacji.

jrel
źródło
1
Uważaj na komendę rm -rf old_git. Spowoduje to usunięcie całego repozytorium old_git. Jeśli nie rozumiem właściwie twojego problemu, może to być zła rzecz.
jrel
0

Znajduję teraz alternatywne rozwiązanie.

Za pomocą rysnc -r /origin/* /target/można zsynchronizować całą zawartość z katalogu źródłowego do katalogu docelowego.

Zen
źródło
8
Uważam, że nie obejmuje to plików kropek (.foo), ponieważ nie będą one dopasowane do gwiazdki
Ray Burgemeestre
który opiera się na rozszerzeniu glob powłoki, technicznie przekaże każdy znaleziony plik jako argument do rsync. jest prawie tak samo jak bieganie rsync -r $(find /origin -maxdepth 1 -type f) /target/ . Jak wskazał @RayBurgemeestre, rozszerzenie globu powłoki nie będzie zawierać plików kropek.
Florian Castellane