Sabit bağlantıları koruyarak dizinler nasıl kopyalanır?


40

Ortak dosyaları olan dizinler bir bölümden diğerine nasıl taşınır?

/mnt/XHardlink'lerle dosya paylaşan dizinlere bağlı bir bölüme sahip olduğumuzu varsayalım . Bu tür dizinlerin başka bir bölüme nasıl taşınacağı, /mnt/Ybu hardlinkleri koruyarak olmasına izin verin .

Daha iyi örnekleme için "Hardlink'lerle ortak dosya paylaşan dizinler" derken ne demek istiyorum?

# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a

Daha açık olmak gerekirse, toplam dosya boyutunun 10G olduğunu ve her dosyanın 10 hardlink olduğunu varsayalım. Soru, 10G kullanarak hedefe nasıl taşınacağını (biri 100G ile kopyalamak ve ardından veri tekilleştirmeyi çalıştırmak hakkında söyleyebilir - bu benim sorduğum şey değil).

Yanıtlar:


29

İlk cevap: GNU Yolu

GNU cp -a, mümkün olduğu kadar çok yapı ve meta verileri koruyarak tekrar tekrar kopyalar. Kaynak dizindeki dosyalar arasındaki sert bağlantılar buna dahil edilir. Sabit bağlantı korumasını diğer tüm özellikleri olmadan özellikle seçmek için -akullanın --preserve=links.

mkdir src
cd src
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
cp -r -l a hardlinks_of_a
cd ..
cp -a src dst

3
Katran üzerinde +1, cp'ye gnu'ya özgü argümanlar kullanmak için -1.
WhyNotHugo,

Birinde üç cevap verdin. Ayrı olarak yorumlanıp değerlendirilebilmeleri için onları ikiye böler misiniz? (İpucu: Bunu, yalnızca bir tane bırakacak şekilde düzenleyebilirsiniz - örneğin "cp -a". Daha sonra "katran" ve "pax" için iki tane daha ekleyin)
Grzegorz Wierzowiecki

1
@ GrzegorzWierzowiecki split tamamlandı
Alan Curry

6
@Hugo: GNU'ya özgü argümanları standart aletlerde kullanmakta yanlış bir şey yoktur. GNU sürümleri bugünlerde fiili standartlar ve önceden kurulmamış olsalar bile GNU araçlarını yüklemek yaygın bir pratikti (biliyorum ki her zaman yaptım - onlar solaris ve * bsd sürümlerinden daha iyiydiler) ve farklı * nix'ler arasında tutarlılık sağladılar). GNUisms, bunları kullanırken, ancak gerekmediğinde işaret etmek muhtemelen iyi bir uygulamadır. Ayrıca Grzegorz "linux'da değil" demedi, bu yüzden bahsettiği ortamın olduğunu varsaymak mantıklı.
cas,

1
@WhyNotHugo: POSIX nasıl "daha fazla standart olabilir"? POSIX bizi olduğumuz yere getiren şeyler. Windows NT'den bu yana tüm Windows sürümlerinin tam POSIX uyumlu olduğunu biliyor muydunuz? POSIX dosya G / Ç işlevlerini kullanırken, onları işe yaramaz hale getiren 255 karakterlik bir yol uzunluğu sınırlaması vardır. Solaris, Irix, HP-UX'in tüm POSIX uyumlu olduğunu ve yine de araçlarındaki tüm argümanların farklı olduğunu biliyor muydunuz (örneğin tar). cp -a, GNU kopyasını değiştirmek isteyen herhangi bir cp sürümü için minimum bir gerekliliktir.
Johannes Overmann

36

rsync, bunun için bir seçeneğe -Hveya --hard-linksseçeneğe sahiptir ve bir önceki çalıştırma sırasında / sonrasında değiştirilen herhangi bir dosyayla etkin bir şekilde başa çıkmanın ve durdurulup yeniden başlatılmanın olağan rsync avantajlarına sahiptir.

-H, --hard-links
    This tells rsync to look for hard-linked files in
    the source and link together the corresponding
    files on the destination.  Without  this option,
    hard-linked files in the source are treated as
    though they were separate files. [...]

rsyncMan sayfasını okuyun ve -H arayın. Belirli uyarılar hakkında daha fazla ayrıntı var.


2
Kontrol ettim - işe yarıyor.
Grzegorz Wierzowiecki

Evet biliyorum. Yedek komut dosyalarımda yıllardır kullanıyorum. Ayrıca, sorunuzu olduğu gibi dosyaları dosyalar arasında taşımak için de kullanın.
cas,

rsync, dosya listesini oluştururken bir miktar hafıza kullanır. Benim için saatler süren "Dosya listesi oluşturuluyor ..." derken benim için 16GB'lık hafızamı doldurdu ve hiçbir şey kopyalamadığı için kurtarıldı. YMMV.
msc

2
Kimden man rsync: rsync 3.0.0 ile başlayarak, kullanılan özyinelemeli algoritma şimdi öncekinden çok daha az bellek kullanan artımlı bir taramadır ve ilk birkaç dizinin taranması tamamlandıktan sonra aktarımı başlatır. Bu artımlı tarama sadece özyineleme algoritmamızı etkiler ve özyinelemeli olmayan bir aktarımı değiştirmez. Ayrıca, aktarımın her iki ucu da en az 3.0.0 sürümü olduğunda mümkündür. Not hem o --delete-beforeve --delete-afterdevre dışı bırakma Bu iyileştirilmiş algoritma.
cas

Ayrıca, rsyncinanılmaz derecede faydalı olsa da, her iş için her zaman en iyi araç değildir. Bu günlerde, ZFS veri kümelerini kullanmayı tercih ediyorum, böylece anlık görüntüleri ve zfs sendonları yakalayabiliyorum - çoğunlukla ZFS olmayan dosya sistemlerinde rsync kullanıyorum. btrfsbenzer bir anlık görüntü + gönderme özelliğine sahiptir.
cas

14

Üçüncü cevap: POSIX Yolu

POSIX, arşiv biçimini tarstandartlaştırmış olsalar bile , yardımcı programı standartlaştırmamıştır tar. Katran arşivlerini işlemek için POSIX yardımcı programı çağrılır paxve tek bir işlemle paketi yapabilme ve paketi açabilme özelliğine sahiptir.

mkdir dst
pax -rw src dst

10

İkinci cevap: Eski UNIX Yolu

Kaynak dizinde bir tar arşivi oluşturun, bir borunun üzerinden gönderin ve hedef dizinde açın.

# create src as before
(cd src;tar cf - .) | (mkdir dst;cd dst;tar xf -)

1
kontrol edildi -> çalışıyor. Hardlinks korunmuş.
Grzegorz Wierzowiecki

1
Bunun neden gerçek bağlantıları koruduğuna dair bir içgörü var mı?
Peterph,

1
Çünkü tarsabit bağlantıları korur. GNU katranında, en azından, bu davranışı--hard-dereference
cas

Benim durumumda, büyük bir dizin hiyerarşisini kopyalamaya çalışmak (bir TimeMachine yedeği), tar bazı sert linkleri korumuş ancak bazı durumlarda dosyayı kopyalamıştır. Bunun sebebi, tar xdosyalar hala üzerinden aktarılmakta olduğundan tam dosya listesine sahip olmamasıdır tar c. Muhtemelen çıkartmadan önce tüm arşivi kurtardıysanız, sorun olmaz. Birisi bu teoriyi onaylarsa çok mutlu olurum.
msc

10

Kaynak: http://www.cyberciti.biz/faq/linux-unix-apple-osx-bsd-rsync-copy-hard-links/

Kesin bir kopya çıkarmak için ihtiyacınız olan şey

rsync -az -H --delete --numeric-ids /path/to/source/ /path/to/dest/

Yukarıdaki rsync hakkındaki yorumuma bakın.
msc

1
Bunun ACL'leri, genişletilmiş öznitelikleri vb. Kopyalamayacağından şüpheleniyorum. Linux sürümü ayrıca bunları korumak için -A ve -X seçeneklerine sahiptir, ancak MacOS'ta şansınız tükendi.
Edward Falk
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.