हार्डलिंक को संरक्षित करने के साथ निर्देशिकाओं की नकल कैसे करें?


40

उन निर्देशिकाओं को कैसे स्थानांतरित करें जिनमें एक से दूसरे विभाजन में आम फाइलें हों?

मान लें कि हमारे पास /mnt/Xहार्डलिंक्स के साथ फाइल साझा करने वाली निर्देशिकाओं के साथ विभाजन है । ऐसी निर्देशिकाओं को दूसरे विभाजन में कैसे स्थानांतरित किया जाए, यह /mnt/Yउन हार्डलिंक्स को संरक्षित करने के साथ होने दें ।

बेहतर चित्रण के लिए मेरा क्या मतलब है "हार्डलिंक्स के साथ आम तौर पर फाइलें साझा करने वाली निर्देशिका", यहां एक उदाहरण है:

# 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

अधिक विशिष्ट होने के लिए, मान लें कि फ़ाइलों का कुल आकार 10G है और प्रत्येक फ़ाइल में 10 हार्डलिंक हैं। सवाल यह है कि इसे 10G का उपयोग करके गंतव्य पर कैसे ले जाया जाए (कोई व्यक्ति इसे 100 जी के साथ कॉपी करने और फिर कटौती के बारे में कह सकता है - यह वह नहीं है जिसके बारे में मैं पूछ रहा हूं)

जवाबों:


29

पहला उत्तर: जीएनयू मार्ग

जीएनयू cp -aप्रतियों को यथासंभव संरचना और मेटाडेटा के रूप में संरक्षित करता है। स्रोत निर्देशिका में फ़ाइलों के बीच हार्ड लिंक इसमें शामिल हैं। -aउपयोग की अन्य सभी विशेषताओं के बिना विशेष रूप से हार्ड लिंक संरक्षण का चयन करने के लिए --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
टार पर +1, cp के लिए gnu- विशिष्ट तर्कों का उपयोग करने के लिए।
WhyNotHugo

आपने एक में तीन उत्तर दिए। क्या आप उन्हें तीन में विभाजित कर सकते हैं ताकि उन्हें अलग से टिप्पणी और मूल्यांकन किया जा सके? (टिप: आप इसे संपादित कर सकते हैं, केवल एक को छोड़ने के लिए - उदाहरण के लिए "cp -a"। बाद में "टार" और "पैक्स" के लिए दो और जोड़ दें)
ग्रेज़गोरज़ विएर्ज़ोइकी

1
@GrzegorzWierzowiecki विभाजित पूरा
एलन करी

6
@ ह्यूगो: मानक उपकरणों के लिए जीएनयू-विशिष्ट आर्गन्स का उपयोग करने में कुछ भी गलत नहीं है। जीएनयू संस्करण इन दिनों डी-फैक्टो मानक हैं, और यहां तक ​​कि जब वे पूर्व-स्थापित नहीं थे, तो जीएनयू उपकरण स्थापित करना आम बात थी (मुझे पता है कि मैंने हमेशा किया था - वे बस से बेहतर थे, जैसे, सोलारिस और * बीएसडी संस्करण , और उन्होंने अलग-अलग * निक्स के बीच स्थिरता प्रदान की)। जब आप उनका उपयोग करते हैं, लेकिन आवश्यक नहीं है, तो शायद GNUism को इंगित करना अच्छा अभ्यास है। इसके अलावा ग्रेज़गोरज़ ने "लिनक्स पर नहीं" नहीं कहा, इसलिए यह मान लेना उचित है कि वह जिस पर्यावरण के बारे में बात कर रहे हैं।
कैस

1
@WhyNotHugo: POSIX "अधिक मानक कैसे हो सकता है?"। POSIX वह सामान है जो हमें लाया है जहां हम हैं। क्या आप जानते हैं कि Windows NT के बाद से सभी विंडोज संस्करण पूरी तरह से POSIX अनुरूप हैं? POSIX फ़ाइल I / O फ़ंक्शन का उपयोग करते समय उनके पास 255 वर्णों की एक पथ लंबाई सीमा होती है, जो उन्हें बेकार प्रदान करती है। क्या आप जानते हैं कि Solaris, Irix, HP-UX सभी POSIX कंप्लेंट हैं, और फिर भी उनके टूल्स के सभी तर्क अलग-अलग हैं (जैसे टार)। cp -a किसी भी cp संस्करण के लिए एक न्यूनतम आवश्यकता है जो GNU कॉपी को बदलना चाहता है।
जोहान्स ओवरमैन

36

rsync एक है -Hया --hard-linksइस के लिए विकल्प, और सक्षम होने का हमेशा की तरह rsync लाभ बंद कर दिया करने के लिए किया जा और पुन: प्रारंभ, और फिर से चलाने के कुशलता से करने के लिए है कि पिछले चलाने के बाद / दौरान बदला गया था किसी भी फाइल के साथ सौदा हो गया है।

-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. [...]

rsyncमैन पेज पढ़ें और -H खोजें। वहाँ विशेष रूप से caveats के बारे में बहुत अधिक विस्तार है।


2
मैंने जाँच की है - यह काम करता है।
ग्रेज़गोरज़ विएर्ज़ोवेकी

हां मुझे पता है। मैं इसे सालों से अपनी बैकअप स्क्रिप्ट में इस्तेमाल कर रहा हूं। अपने सवाल के रूप में filesystems के बीच फ़ाइलों को स्थानांतरित करने के लिए भी।
कैस

rsync अपनी फ़ाइल सूची बनाते समय मेमोरी के gobs का उपयोग करता है। मेरे लिए "बिल्डिंग फ़ाइल सूची ..." के कई घंटों के बाद इसने मेरी 16GB मेमोरी को भर दिया और कुछ भी कॉपी नहीं किया। YMMV।
msc

2
से man rsync: rsync 3.0.0 के साथ शुरू होने वाले, पुनरावर्ती एल्गोरिथ्म का उपयोग अब एक वृद्धिशील स्कैन है जो पहले की तुलना में बहुत कम मेमोरी का उपयोग करता है और पहले कुछ निर्देशिकाओं के स्कैनिंग के बाद स्थानांतरण शुरू होता है। यह वृद्धिशील स्कैन केवल हमारे पुनरावृत्ति एल्गोरिथ्म को प्रभावित करता है, और गैर-पुनरावर्ती हस्तांतरण को नहीं बदलता है। यह केवल तभी संभव है जब हस्तांतरण के दोनों छोर कम से कम संस्करण 3.0.0 हैं। नोट दोनों कि --delete-beforeऔर --delete-afterअक्षम यह बेहतर एल्गोरिथ्म।
कैस

इसके अलावा, जबकि rsyncएक अविश्वसनीय रूप से उपयोगी भी है, यह हमेशा हर काम के लिए सबसे अच्छा उपकरण नहीं है। इन दिनों, मैं ZFS डेटासेट का उपयोग करना पसंद करता हूं, इसलिए मैं स्नैपशॉट दे सकता हूं और zfs sendउन्हें - मैं ज्यादातर गैर-जेडएफएस सिस्टम पर rsync का उपयोग करता हूं। btrfsएक समान स्नैपशॉट + भेजने की क्षमता है।
कैस

14

तीसरा उत्तर: पोसिक्स वे

POSIX ने tarउपयोगिता को मानकीकृत नहीं किया है , हालांकि उन्होंने tarसंग्रह प्रारूप को मानकीकृत किया है । टार अभिलेखागार में हेरफेर के लिए POSIX उपयोगिता को कहा जाता है paxऔर इसमें एक ही प्रक्रिया में पैक और अनपैक संचालन करने में सक्षम होने की बोनस सुविधा है।

mkdir dst
pax -rw src dst

10

दूसरा उत्तर: प्राचीन प्राचीन तरीका

स्रोत निर्देशिका में एक टार आर्काइव बनाएं, इसे एक पाइप पर भेजें, और इसे गंतव्य निर्देशिका में अनपैक करें।

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

1
जाँच -> काम करता है। हार्डलिंक संरक्षित है।
ग्रेजेगॉर वियरज़ोवेकी

1
यह वास्तव में हार्डलिंक को संरक्षित क्यों करता है में कोई अंतर्दृष्टि?
पेटर्फ

1
क्योंकि tarहार्ड-लिंक को संरक्षित करता है। जीएनयू राल में, कम से कम, तो आप इस व्यवहार के साथ निष्क्रिय कर सकते हैं--hard-dereference
cas

मेरे मामले में, एक बड़ी निर्देशिका पदानुक्रम (एक TimeMachine बैकअप) की प्रतिलिपि बनाने का प्रयास करते हुए, टार ने कुछ हार्ड लिंक संरक्षित किए लेकिन कुछ मामलों में फ़ाइल को दोहराया। मुझे लगता है कि ऐसा इसलिए है क्योंकि tar xफाइल की पूरी सूची नहीं है क्योंकि फाइल अभी भी अंदर से पाइप की जा रही है tar c। संभवतः यदि आप इसे निकालने से पहले पूरे संग्रह को सहेजते हैं, तो यह ठीक होगा। अगर कोई उस सिद्धांत की पुष्टि कर सकता है तो मुझे बहुत खुशी होगी।
msc

10

स्रोत: http://www.cyberciti.biz/faq/linux-unix-apple-osx-bsd-rsync-copy-hard-links/

आपको एक सटीक प्रतिलिपि बनाने की आवश्यकता है

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

ऊपर rsync के बारे में मेरी टिप्पणी देखें।
msc

1
मुझे संदेह है कि यह ACLs, विस्तारित विशेषताओं और आगे की प्रतिलिपि नहीं करेगा। लिनक्स संस्करण में इन्हें संरक्षित करने के लिए -A और -X विकल्प भी हैं, लेकिन मुझे लगता है कि आप MacOS पर भाग्य से बाहर हैं।
एडवर्ड फॉक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.