3 निर्देशिकाओं में 2 निर्देशिकाओं और कॉपी अंतरों की तुलना करें


32

Ubuntu 12.04 पर चलते हुए, मैं 2 निर्देशिकाओं की तुलना करना चाहता हूं, फ़ोल्डर 1 / और फ़ोल्डर 2 / और किसी भी फाइल को कॉपी करने के लिए कहता हूं जो फ़ोल्डर / और के लिए अलग है। नेस्टेड फाइलें भी हैं, इसलिए मिलान किए जाने वाले उपनिर्देशिकाओं को भी कॉपी किया जाना चाहिए

क्या कोई एकल आदेश है जो मेरी मदद करेगा? मैं चल रही परिवर्तित फ़ाइलों की पूरी सूची प्राप्त कर सकता हूं:

rsync -rcnC --out-format="%f" folder1/ folder2/

लेकिन rsync के पास इन फ़ाइलों को एक अलग लक्ष्य निर्देशिका पर "निर्यात" करने की क्षमता नहीं है। क्या मैं सूची को cp या किसी अन्य प्रोग्राम में पाइप कर सकता हूं, ताकि फाइलें कॉपी हो जाएं, जबकि निर्देशिकाएं भी बनाई गई हैं? उदाहरण के लिए, मैंने कोशिश की

rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/

लेकिन यह भी निर्देशिकाओं को संरक्षित नहीं करेगा, यह बस फ़ोल्डर 3 के अंदर सभी फाइलों को कॉपी करेगा /


मैं शायद diff -qrऔर awkफिर सूची बनाने के लिए कुछ संयोजन का उपयोग करूँगा , rsync...
ewwhite

मैं सूची के साथ rsync का उपयोग कैसे करूंगा?
पेरिक्लीस

मैं या तो एक लूप चलाऊंगा या rsync --include-from=FILEविकल्प का उपयोग करूंगा ।
ewwhite

(आलसी मत बनो ...) लेकिन नीचे rsync समाधान सुरुचिपूर्ण है।
ewwhite

जवाबों:


38

उपयोग करें - इंकम-डेस्ट।

मैन पेज से:

--compare-dest = DIR - यह विकल्प rsync को निर्देश देता है कि डेस्टिनेशन मशीन पर DIR का उपयोग एक अतिरिक्त पदानुक्रम के रूप में किया जाए ताकि वह ट्रांसफ़र करने के विरुद्ध गंतव्य फ़ाइलों की तुलना कर सके (यदि गंतव्य निर्देशिका में फ़ाइलें गायब हैं)। यदि कोई फ़ाइल DIR में मिलती है जो प्रेषक की फ़ाइल के समान है, तो फ़ाइल को गंतव्य निर्देशिका में स्थानांतरित नहीं किया जाएगा। यह उन फ़ाइलों का एक विरल बैकअप बनाने के लिए उपयोगी है जो पहले के बैकअप से बदल गए हैं।

पहले अपने सिंटैक्स को --dry-run से जांचें

rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/

फिर एक बार जब आप आउटपुट से संतुष्ट हो जाते हैं:

rsync -aHxv --progress  --compare-dest=folder2/ folder1/ folder3/

यह लिंक में एक अच्छी व्याख्या है- कॉमपेयर-डेस्ट स्कोप।


1
इसके लिए धन्यवाद, मैं इस पैरामीटर के मैन पेज स्पष्टीकरण को नहीं समझ पाया था। रुचि रखने वाले किसी के लिए, मैंने इसे कियाrsync -rcC --compare-dest=folder2/ folder1/ folder3/
पेरिक्लीस

OsX उपयोगकर्ताओं के लिए त्वरित ध्यान दें। मैं rsync version 3.1.1 protocol version 31अपने स्थानीय पर है और rsync परम के ~/लिए रास्तों को नहीं समझता है --compare-dest
Jevgeni Smirnov

4
मेरे लिए, --compare-destएक परम मार्ग की आवश्यकता है।
पाल्सीम

लेखक या ओपी के विकल्प के साथ मेरे लिए काम नहीं किया। यानी यह fonts/Makefile.inफ़ाइल को आउटपुट करता है, जो दोनों folder2और folder1dirs में समान है ।
हाय-एंजेल

3

यह छोटी स्क्रिप्ट काम करना चाहिए:

folder1="firsts_folder/"
folder2="second_folder/"
folder3="target_folder"
for x in `rsync -rcnC --out-format="%n"  $folder1 $folder2`
    do
        if [ -d "$folder1/$x" ]; then
            mkdir -p "$folder3/$x"
        else
            cp -frv $folder1/$x $folder3/$x
        fi
done

लेकिन मुझे यह भी लगता है कि diff -qr का पार्सिंग आउटपुट एक बेहतर समाधान होगा क्योंकि यह आपको लगातार प्रत्येक फाइल के लिए रास्ता और नाम देता है।

संपादित करें

यह एक कमांड होगी, आपकी कमांड थोड़ा संशोधित होगी। लेकिन यह के folder1तहत पैदा करेगा folder3। और यह पूर्ण पथ के साथ काम नहीं करता है, लेकिन ऊपर की स्क्रिप्ट भी पूर्ण पथ के साथ काम नहीं करती है।

rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/

मैं इसे खाली करने वाली फ़ाइलों और निर्देशिकाओं के साथ काम करने के लिए उपयोग करता \"था rsync। उबंटू 10.04 पर परीक्षण किया गया। आशा करता हूँ की ये काम करेगा।


इसके लिए धन्यवाद, मुझे उम्मीद थी कि एक एकल आदेश मौजूद होगा
पेरिक्लीस

2
rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/

यदि आप folder1आदेश जारी करने से पहले पहले नीचे उतरना चाहते हैं तो यह सबसे सरल रूप है, जिसके साथ मैं आ सकता था।

यह धीमा विकल्प है, लेकिन मेरा मानना ​​है कि यह आपकी आवश्यकताओं को पूरा करता है, और इसे गैर-रिश्तेदार निर्देशिका नामों का उपयोग करके निष्पादित किया जा सकता है:

rsync -rcnC --out-format="%n" folder1/ folder2/ |grep -vP "/$" |xargs -I{} rsync -R folder1/./{} folder3/

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

grepवहाँ के उत्पादन से निर्देशिका नाम हटाने के लिए है rsync

का उत्पादन grepतो दूसरे rsyncका उपयोग करने के लिए पाइप है xargs। परम folder1/./{}में अतिरिक्त ./का उपयोग rsync को बताने के लिए किया जाता है ./{}, जो कि संबंधित निर्देशिकाओं को अनदेखा करने के साथ शुरू करता है folder1/। दूसरे शब्दों में, यह बनाने से बचता है folder3/folder1/

मैं केवल CentOS 6.4 पर यह परीक्षण करने में सक्षम था, लेकिन AFAIK को उबंटू 12.04 में ही काम करना चाहिए।

संपादित करें: मुझे ध्यान देना चाहिए कि स्मिथ का उत्तर निस्संदेह बेहतर है, लेकिन मैं इसे अपने मूल rsyncआदेश के साथ चातुर्य में लेना चाहता था क्योंकि यह आपको वांछित आउटपुट दे रहा था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.