एमवी को जारी रखने के लिए सबसे अच्छा अभ्यास


13

मैंने एक ड्राइव से दूसरे ड्राइव पर फाइल कॉपी करने के लिए टर्मिनल का इस्तेमाल किया।

sudo mv -vi /location/to/drive1/ /location/to/drive2/

हालाँकि, यह अचानक बंद हो गया, जबकि कुछ घंटों में, और एक त्रुटि के बिना, एक निर्देशिका बनाने के बाद।

मेरा अपना समाधान अक्सर हैशिंग और तुलना का मिश्रण होता है, जो ज्यादातर समय लेने वाली गड़बड़ी होती है क्योंकि मुझे अब एक इंटरमीडिएट कॉपी से उबरना पड़ता है बिना यह जाने कि कौन सी फाइलें गायब हैं (zsh के लिए बहुत लंबे वन-लाइनर के रूप में लिखा गया है - ध्यान दें) यह स्क्रिप्ट लिखित रूप में काम नहीं करती है):

source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
    echo "${hash_and_file}" | read hash file;
    echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
    echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
    mv -v "${copy_from}" "${copy_to}" | tee -a log;
    rm -v "${copy_from}" | tee -a log; };
done <<<$(
    comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${source_directory}: :g" | sort;
           ) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${target_directory}: :g" | sort; ) )

यह त्रुटि प्रवण है यदि नाम लक्ष्य निर्देशिका या source_directory पथ का हिस्सा है, और फ़ाइलों को हटा दें यदि उन्हें स्थानांतरित नहीं किया गया है क्योंकि उन्हें डुप्लिकेट के रूप में चिह्नित किया गया था। इसके अलावा यह अंत में स्रोत निर्देशिका नहीं करता है।

वहाँ एक सबसे अच्छा अभ्यास कैसे बाधित एमवी से उबरने के लिए है?


मैंने एक समान स्क्रिप्ट लिखी , जो cmpहैशिंग के बजाय उपयोग करता है । इसमें निर्भरताएं हैं, और while readगिल्स के उल्लेख के साथ वही मुद्दे हैं । यह धीमा और क्रियाशील भी है। लेकिन यह rsync विधि की तुलना में जल्द ही डिस्क-स्पेस को मुक्त कर देता है, क्योंकि फाइल (re) स्रोत से चलती है क्योंकि यह चलती है। यह बहादुर के लिए प्रेरणा का काम कर सकता है।
joeytwiddle

3
@joeytwiddle rsync प्रदान करता है --delete-during receiver deletes during the transferऔर कई अन्य उपयोगी विकल्प भी --delete --delete-before --delete-delay --delete-after --delete-excluded:। तो, हाँ, rsync सबसे अच्छा विकल्प है,
NotAnUnixNazi

मेरा कुछ छूट रहा है। सिर्फ वही mvकाम क्यों नहीं दोहरा रहा है ? *मूल स्रोत एक निर्देशिका था, तो शायद स्रोत पथ में जोड़ा गया।
jpa

@ आइसाक नहीं, मुझे डर है rsync --delete*कि एक आपदा होगी ! यह उन चीजों को हटा देगा, destजो वर्तमान में नहीं हैं src, इसलिए सभी फाइलें जो पिछले प्रयास में सफलतापूर्वक स्थानांतरित हो गई थीं, अब हटा दी जाएंगी! आप शायद सोच रहे थे rsync --remove-source-filesकि मैं सहमत हूं कि एक अच्छा विकल्प होगा। ( More1 , और जानें 2 )
joeytwiddle

@joeytwiddle नहीं, केवल अन्य फ़ाइलों को हटा rsync --deleteदेगा जो स्रोत का हिस्सा नहीं हैं। [आदमी rsync] () से * नष्ट dirs से असंगत फ़ाइलों को हटाएं *। समझें कि बाहरी का क्या मतलब है: सिंक नहीं किया जा रहा है। और हाँ, rsync स्रोत फ़ाइलों को हटाने का एक तरीका भी प्रदान करता है , क्योंकि वे सही ढंग से प्रेषित किए जाते हैं।
NotAnUnixNazi

जवाबों:


46

Rsync पर लगाम लगाने की कोशिश के बारे में भूल जाओ, और rsync का उपयोग करें।

sudo rsync -av /location/to/drive1/ /location/to/drive2/

सुनिश्चित करें कि आप स्रोत पर ट्रेलिंग स्लैश का उपयोग करते हैं, अन्यथा यह कॉपी करना होगा /location/to/drive2/drive1

डबल-जांचें कि कमांड सफल हुआ, फिर चला rm -rf /location/to/drive1/

ऊपर दिए गए आदेश से किसी भी preexisting फ़ाइल को अधिलेखित किया जाएगा drive2। यदि आप उपयोगकर्ता को उन फ़ाइलों को छोड़ने के लिए संकेत देना चाहते हैं drive2, जो पहले से मौजूद हैं mv -i, तो यह अधिक जटिल है, क्योंकि अब आपको उन फ़ाइलों को भेद करने की आवश्यकता है जो पहले से ही कॉपी की गई हैं और वे फाइलें जो नहीं हैं। आप उन --ignore-existingफ़ाइलों को छोड़ने के लिए rsync का विकल्प पास कर सकते हैं जो पहले से ही उनकी सामग्री की परवाह किए बिना गंतव्य पर मौजूद हैं। ध्यान दें कि यदि mvफ़ाइल बनाने के बीच में मूल बाधित किया गया था, तो यह फ़ाइल अपने आधे-प्रतिलिपि की स्थिति में रहेगी (जबकि एक नंगे rsync -aने इसे कॉपी करना ठीक से समाप्त कर दिया होगा)।

यदि आप mv -iप्रॉम्प्टिंग सहित सटीक व्यवहार को पुन: पेश करना चाहते हैं , तो यह किया जा सकता है, लेकिन यह बहुत अधिक जटिल है।

ध्यान दें कि आपका एक विशालकाय-लाइनर बहुत नाजुक है। यदि फ़ाइल नाम बैकस्लैश या न्यूलाइन्स वाले हैं, तो उन्हें ठीक से कॉपी नहीं किया जा सकता है या वे आपकी स्क्रिप्ट को मनमानी फ़ाइलों को हटाने में भी धोखा दे सकते हैं। इसलिए प्रश्न में कोड का उपयोग न करें जब तक कि आप सुनिश्चित न हों कि आप फ़ाइल नामों पर भरोसा कर सकते हैं जिसमें बैकस्लैश या नईलाइन नहीं हैं।

भविष्य के संदर्भ के लिए, मैं mvबड़े क्रॉस-ड्राइव चालों के लिए कभी भी उपयोग नहीं करने की सलाह देता हूं , ठीक है क्योंकि यह नियंत्रित करना मुश्किल है कि क्या होता है अगर यह बाधित हो जाता है। नकल करने के लिए rsync का उपयोग करें, और फिर मूल निकालें।


Rsync क्या वादे करता है जो mv नहीं करता है?
क्या

4
ठीक है, उदाहरण के लिए rsyncआप क्या करने की कोशिश कर रहे हैं, जबकि mvऐसा नहीं है। इसके अलावा: विभिन्न मशीनों के बीच नकल; स्थानांतरण के लिए संपीड़न; टाइमस्टैम्प- या हैश-आधारित समानता के आधार पर गंतव्य पर मौजूद फाइलें लंघन; स्वामित्व, अनुमतियाँ, लिंक और विशेष फ़ाइलों की विन्यास योग्य संभाल; आदि linux.die.net/man/1/rsync
फ्रीक

1
@SillyFreak क्या मुझे इससे यह निष्कर्ष निकालना चाहिए कि मुझे हमेशा mv के बजाय rsync का उपयोग करना चाहिए, न केवल जैसा कि गिल्स ने क्रॉस-ड्राइव के लिए कहा था, लेकिन किसी भी ऑपरेशन के रूप में, "बहुत बड़ी" की सीमा अपेक्षाकृत व्यक्तिपरक है और अगर यह एक समस्या आती है। यह वैसे भी rsync द्वारा हल किया गया होगा?
क्या

9
ठीक है, जब मैं एक विभाजन के अंदर फ़ाइलों या निर्देशिकाओं को स्थानांतरित कर रहा हूं, तो मैं आमतौर पर mv(या फ़ाइल प्रबंधक) का उपयोग करता हूं, क्योंकि यह केवल फ़ाइल / निर्देशिका का संदर्भ ले रहा है। अगर मुझे वास्तविक डेटा ट्रांसफर करने की आवश्यकता है, तो मैं उपयोग करता हूं rsyncयदि निम्न में से कोई एक सत्य है: 1) मैं एक नज़र में सही ट्रांसफर के लिए जांच कर सकता हूं, जिससे मैं अधिक फ़ाइलों को स्थानांतरित कर रहा हूं; 2) मुझे आशा है कि मुझे फ़ाइलों को सिंक में रखने की आवश्यकता होगी; 3) मुझे उम्मीद है कि स्थानांतरण बाधित हो सकता है। मेरा कहना यह है कि जिस उपयोग के मामले में आप सवाल पेश कर रहे हैं, rsyncवह केवल सही उपकरण है, और mvया cpनहीं।
सिली फ्रीक

7
मैं हमेशा किसी भी rsync कमांड को -v और -dry-run के साथ चलाने की सलाह दूंगा कि वह क्या करने जा रही है, इसकी पुष्टि करने के लिए।
डैरेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.