Bir dizin ağacını çoğaltmak, dosyalara sabit bağlantılar oluşturmak için rsync'i nasıl kullanabilirim?


23

Zaman zaman sunucumdaki veri dosyalarında birkaç büyük geçiş değişikliği yapmam gerekiyor ve bunun için iyi bir yol arıyorum. Kök veri klasöründen başlayarak dizin yapmamı çoğaltmak için rsync'i kullanmayı, tüm orijinal dosyalara (bazıları oldukça büyük) sert bağlantılar oluşturmayı düşünüyordum ve hedef ağaçta yalnızca geçiş gerektiren dosyaların üzerine yazabilirim. Sonunda, iki mvişlemle eski dosyalardan yeni dosyalara güvenle geçebilirim .

Ancak, bunu yapmak için rsync almak gibi görünmüyor. denedim

rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp

ancak, dosyalara sert bağlantılar oluşturmak yerine, rsync onları tamamen kopyalar. Aynı kaynak ve link-dest dizinini kullanırken bir sorun mu var?

Yanıtlar:


21

rsync güçlü bir araçtır, fakat ne yazık ki, bazı patnamesinde garip bir şekilde seçicidir.

Eğer $DATA(bir ile başlar, yani mutlak yol /), daha sonra kullanım için doğru komut satırı:

rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp

[Şimdi, sadece rsyncgariplik hakkında kısa bir süre . Sondaki Not /kaynak bağımsız eklendi. Bu , kaynak dizinin kendisiyle değil, kaynak dizininin içeriğiylersync çalışmayı söyler . (Bunun zaten bir iz içermediğini farz ediyorum .) Bu durumda, içeriklerle çalışmak istiyoruz, bu yüzden izini ekledik .]$DATA//

Öte yandan, varsa $DATAgöreli bir yoldur (yani bu bir ile başlamayan /hakkında, daha sonra Sean R'ın comment) --link-destbağlantı dest yolu göreli yorumlanır: patlama üstünde hedef aşağıdakileri kullanabilirsiniz diye, yolun:

rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp

DÜZENLE

Son bir not, rsyncverdiğim ikinci komut satırının $DATAmutlak bir yol olup olmadığına bakmaksızın çalışması gerektiği , çünkü basenamebir yolun mutlak mı yoksa bağıl mı olduğu ile ilgilenmediği anlaşılıyor .


1
Sadece bunu düşünen eksik bir çizgi… Güzel açıklama için teşekkürler!
Jean-Philippe Pellet

Ben gibi birkaç aşamalı yedekleme yönergeleri izleyerek çalıştım bunun için teşekkür ederiz bu bir ve bu cilvesi herhangi bir söz bulamadık. Bu, dosyaların gerçekten hardlink edilmesini sağlayan tek şeydi. Ref sayısının> 1 olduğunu ve inode numaralarının aynı olduğunu kontrol etmekls -ilah
Walf

Bunu , bir dizini böyle bir dizine yedeklemek için unix.stackexchange.com/a/85068/57414'te açıklanan relpath () işleviyle birlikte kullandım :$SOURCE$TARGETSOURCE='abs_path_to_backup'; TARGET='.'; rsync -a --link-dest=$(relpath $TARGET $SOURCE) $SOURCE/ $TARGET/
Nathan S. Watson-Haigh

13

İstediğiniz şey "cp -al":

cp -al $DATA/ $DATA/../upgrade_tmp/
  • -a gibi bir recurses rsync -a
  • -l, dosyaları kopyalamak yerine bağlayacaktır.

1
cp -alMaalesef sistemimde mevcut değil (Mac OS X 10.6). Onun yerine pax kullanacağım ...
Jean-Philippe Pellet

7

--link-destSeçeneğini rsyncgörelidir hedef dizinde değil, geçerli dizin. Yani istediğin şey:

rsync -a --link-dest=../`basename $DATA` $DATA $DATA/../upgrade_tmp

Hata! Basename demek istedim, başlangıçta bir dizinim vardı.
Sean Reifschneider

1
Adam sayfa söylüyor --link-destseçenek, göreli eğer , hedef dizinine görecelidir. Benim durumumda mutlak. Hedef dizine göre yapmak bile bu işi yapmaz.
Jean-Philippe Pellet

7

Bunu yapmanın rsyncdiğer araçlardan daha zor olduğu ortaya çıkıyor . Bunun için doğru cevap rsyncSteven Monai’dir, ancak bunu yapmanın en kolay yolu ya cp -alda aşağıdakiler için geçerli bir seçenek olmayan pax -rwlsistemlerde kullanmaktır :-lcp

pax -rwl $DATA $DATA/../upgrade_tmp

veya

cp -al $DATA/ $DATA/../upgrade_tmp/

4

Benim için çalışıyor:

$ rsync --hard-links --recursive --link-dest=/local user@host:/remote/ /local

Rsync 3.1.0 sürümünü kullanıyorum.

Gönderen adam :

--hard-bağlantılar

Rsync'e aktarımdaki sabit bağlı dosyaları aramasını söyler, bu seçenek olmadan aktarımdaki sabit bağlı dosyalar ayrı dosyalarmış gibi ele alınır.

--link-dest = dizin

Değişmeyen dosyaların DIR'den hedef dizine bağlanması zor. Dosyaların birbirine bağlanması için dosyaların korunan tüm niteliklerde aynı olması gerekir (örn. İzinler, muhtemelen sahiplik)


2
Yalnızca kod pasajı yeterli değil, ne yaptığını ve nedenini açıklayın.
peterh, Monica

- hard-links rsync'e aktarımdaki sabit bağlı dosyaları aramasını söyler, bu seçenek olmadan aktarımdaki sabit bağlı dosyalar ayrı dosyalarmış gibi işlenir. --link-dest = DIR Değişmeyen dosyalar DIR'den hedef dizine bağlanır. Dosyaların birbirine bağlanması için, tüm korunan niteliklerde (örneğin izinler, muhtemelen sahiplik) dosyaların aynı olması gerekir.
Alexander Fedorov

1
Olağanüstü. Teşekkür ederim. Aslında, cevabınızı "düşük kalite" kuyruğunda buldum. Bu, cevabınızın silinmesi veya silinmemesi durumunda bir oylama olduğu anlamına gelir. Ancak yalnızca silme tehlikesi değil, iyi biçimlendirilmiş bir "insan" yanıtı vermeye çalışmak için bir neden olmakla kalmaz, aynı zamanda bir artı puan toplamak istiyorsanız da çok yardımcı olur.
peterh, Monica’nın


2

İlk önce sadece varış yerindeki dizinleri yaratın:

rsync -av --include '*/' --exclude '*' /source/ /destination/

Sonra sadece dosyaları bağlamak zor:

cd /source
find . -type f -exec ln -v {} /destination/{} \;

Teşekkürler - aslında, paxyukarıdaki yorumumda gösterildiği gibi daha iyi kullanabilirim .
Jean-Philippe Pellet

1

Hardlinks korumak ve manpage okumak için Seçenek -H kullanın.


1
-H çalışmıyor. Kaynak ağacımda korumak için hiçbir zor bağlantım yok, sadece kaynak ağacımın basit bir kopyasını istiyorum, kopyada tüm dosyalar orijinal dosyalara bağlandı. Asıl sorumun sorumluluğu belirsizdi…
Jean-Philippe Pellet

“manpage oku” bir cevap mı? :-)
meduz
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.