Skopiuj dowiązanie symboliczne ORAZ tam, gdzie wskazuje na użycie rsync

11

Nie trzeba tego robić rsync, ale byłoby miło nie pisać scenariusza, aby to zrobić, i rsyncjest bardzo blisko tego, czego chcę.

rsync -a(lub -l) może zachować dowiązania symboliczne i -Lmoże wyrejestrować dowiązania symboliczne i skopiować je tak, jakby to był normalny plik / katalog. Czy można jednak zachować dowiązanie symboliczne, a także skopiować pliki / katalogi, do których prowadzą łącza?

Oto przykład. Powiedzmy, że mamy tę hierarchię folderów:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

a kiedy to zrobię rsync -aR dirA dest(lub coś innego), chciałbym, aby dokładnie te pojawiały się w dest:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

Czy to jest możliwe rsync? Dziękuję Ci.

Załóżmy, że dowiązania symboliczne posiadające bezwzględną ścieżkę lub wskazujące na zewnątrz katalogu źródłowego mogą zostać zignorowane.

Wei-Yin
źródło
1
Myślę, że twoja prośba jest nieokreślona: potrzebujesz, jeśli dirA/linkjest dowiązaniem symbolicznym do ../dirB/file, to powinno to być traktowane jako kopiowanie dirB/filedo dest/dirB/filei dirA/linkdo dest/dirA/link. Co jeśli dirA/linkjest link do ../../another_file? Co się dzieje, jeśli dirA/linkwskazuje na katalog znajdujący się wyżej w drzewie katalogów?
Riccardo Murri
Dobry chwyt W moim przypadku użycia nie ma punktu odsyłacza na zewnątrz drzewa i nie ma bezwzględnej ścieżki w łączach.
Wei-Yin
1
Im więcej o tym myślę, tym bardziej myślę, że żadna standardowa narzędzie tego nie zrobi. W ogólnym przypadku, może trzeba utworzyć dużą liczbę docelowych podanych jedno źródło, jeśli masz dowiązania do dowiązania symbolicznego lub bardziej ogólnie dowiązania symbolicznego, którego docelowa zawiera dowiązania (np a -> b, b -> c/foo, c -> d/e: żądanie kopia apowinny również kopiować b, c, c/foo, d, d/ei d/e/foo).
Gilles 'SO- przestań być zły'
@Gilles: Tak, masz rację. Śledzenie linków może prowadzić do włączenia wielu plików, o ile są one nadal w katalogu źródłowym.
Wei-Yin

Odpowiedzi:

2

Jeśli znasz nazwę dowiązania symbolicznego i chcesz przenieść link i cel , możesz:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

Pierwsze rsynctransfery tylko symlink. Drugie polecenie znajduje prawdziwą nazwę katalogu, a drugie rsyncprzenosi zawartość katalogu.

użytkownik201564
źródło
0

Byłoby to możliwe, gdyby tylko wszyscy byli w „mydir” i mielibyście synchronizować „mydir” z jednego miejsca do drugiego. Rsync nie jest w stanie kopiować poza podaną ścieżką (z wyjątkiem poniższych łączy). na przykład

mydir/dirA ...
mydir/dirB ...
...
ksenoterracid
źródło
Tak, to założenie pasuje do mojego przypadku użycia. Wszystkie linki znajdują się w mydir.
Wei-Yin
@ Wei-Yin, po prostu powiedz mu, żeby nie podążał za dowiązaniami symbolicznymi ... lub czy coś źle zrozumiałem
ksenoterracid
@xenoterracide: Bez względu na to, jak wywołujesz program rsync, myślę, że stworzy on jedno miejsce docelowe dla każdego źródła (inne niż tworzenie wiodących katalogów). Ale Wei-Yin chce stworzyć dwa lub więcej miejsc docelowych: link i jego cel.
Gilles 'SO- przestań być zły'
najwyraźniej jestem zdezorientowany ...
Xenoterracide
@Gilles: nie ma potrzeby rsync śledzić dowiązania, jak będzie synchronizować cel w każdym razie . Najpierw kopiuje dowiązanie symboliczne, tworząc wiszące dowiązanie symboliczne. Następnie kopiuje wszystko inne w katalogu, w tym cel dowiązania symbolicznego. Voila, wszystko ładnie do siebie pasuje.
Martin v. Löwis