Symlink AND'i işaret ettiği yere rsync kullanarak kopyalayın


11

Tarafından yapılması gerekmez rsync, ancak bunu yapmak için bir senaryo yazmak zorunda kalmazsınız ve rsyncistediğime çok yakın.

rsync -a(veya -l) sembolik bağlantıları koruyabilir ve sembolik bağlantıları -Lkaldırabilir ve normal dosya / dizinmiş gibi kopyalayabilir. Ancak, sembolik bağlantıyı tutmak ve bağlantıların işaret ettiği dosyaları / dizinleri kopyalamak mümkün mü?

İşte bir örnek. Diyelim ki bu klasör hiyerarşisine sahibiz:

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

ve rsync -aR dirA dest(ya da başka bir şey) yaptığımda, tam olarak bunların şu şekilde görünmesini istiyorum dest:

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

Bu mümkün mü rsync? Teşekkür ederim.

Diyelim ki mutlak yola sahip olan veya kaynak dizinin dışını gösteren semboller yok sayılabilir.


1
Ben isteğiniz underspecified olduğunu düşünüyorum: Eğer varsa gerektirir dirA/linksembolik köprü ise ../dirB/file, o zaman bu kopyalama olarak ele alınmalıdır dirB/fileetmek dest/dirB/fileve dirA/linkkarşı dest/dirA/link. Ya dirA/linkbir bağlantı varsa ../../another_file? Genel olarak, dirA/linkdizin ağacında daha yüksek bir dizine işaret ederse ne olur ?
Riccardo Murri

İyi yakalama. Kullanım durumumda, ağacın dışında bir bağlantı noktası yoktur ve bağlantılarda mutlak bir yol yoktur.
Wei-Yin

1
Ne kadar çok düşünürsem, standart bir programın bunu yapamayacağını düşünüyorum. Genel durumda, kimin hedefi (bir sembolik içeren sembolik bağlantılara bağlantı sembolik bağ veya daha genel bir sembolik varsa, tek bir kaynak verilmiş yerlerinden çok sayıda kullanıcı oluşturmak gerekebilir örneğin a -> b, b -> c/foo, c -> d/e: kopyasına bir istek ade kopyalamak gerekir b, c, c/foo, d, d/eve d/e/foo).
Gilles 'SO- kötü olmayı bırak'

@Gilles: Evet, haklısın. İzleme bağlantıları, hala kaynak dizinin içinde oldukları sürece çok sayıda dosyanın eklenmesine yol açabilir.
Wei-Yin

Yanıtlar:


2

Symlink adını biliyorsanız ve bağlantıyı ve hedefi aktarmak istiyorsanız:

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

İlk rsynctransfer sadece symlink. İkinci komut gerçek dizin adını bulur ve ikinci komut rsyncdizin içeriğini aktarır.


0

Bu sadece eğer 'mydir' içindeyseniz ve 'mydir'i bir yerden başka bir yere rsync olsaydınız mümkün olurdu. Rsync, verdiğiniz yolun dışına kopyalama yapamaz (aşağıdaki bağlantılar hariç). Örneğin

mydir/dirA ...
mydir/dirB ...
...

Evet, bu varsayım kullanım durumuma uygun. Tüm bağlantılar mydir'in içindedir.
Wei-Yin

@ Wei-Yin daha sonra basitçe sembolik noktaları takip etmemesini söyleyin ... ya da bir şeyi yanlış anlamış
mıyım

@xenoterracide: rsync'i nasıl çağırırsanız sürün, her kaynak için tek bir hedef oluşturacağını düşünüyorum (önde gelen dizinlerin oluşturulması dışında). Ancak Wei-Yin, iki veya daha fazla hedef oluşturmak istiyor: bağlantı ve hedefi.
Gilles 'SO- kötü olmayı bırak'

Görünüşe göre kafam karıştı ...
xenoterracide

@Gilles: hedefi yine senkronize edeceğinden, rsync'in symlink'i takip etmesine gerek yoktur . Bu yüzden önce sembolik bağını kopyalayarak sarkık bir sembolik bağlantı oluşturur. Ardından, sembolik bağlantının hedefi de dahil olmak üzere dizindeki diğer her şeyi kopyalamaya devam eder. Voila, her şey güzelce birbirine uyuyor.
Martin / Löwis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.