जवाबों:
यदि आप एक ही फ़ाइल सिस्टम पर एक निर्देशिका को स्थानांतरित करते हैं , तो आप केवल फ़ाइल सिस्टम में एक स्थान से दूसरे में निर्देशिका प्रविष्टि को स्थानांतरित करते हैं। उदाहरण के लिए, mv /source/dir /target/dir
की निर्देशिका प्रविष्टि को नष्ट करेगा dir
से /source
और में एक नया बना /target
। यह एक परमाणु प्रणाली कॉल (यानी, अबाधित) द्वारा किया जाता है। डायरेक्ट्री प्रविष्टियों के dir
साथ ही डायरेक्टरी की वास्तविक सामग्री से जुड़े इनोड प्रभावित नहीं होते हैं।
यदि आप निर्देशिका को एक फ़ाइल सिस्टम से दूसरे में स्थानांतरित करते हैं , तो सभी फाइलें पहले नई फाइल सिस्टम में कॉपी की जाती हैं और फिर मूल एक से अनलिंक की जाती हैं। इसलिए यदि आप mv
इसे कॉपी करते समय बाधित करते हैं, तो आप कुछ फ़ाइलों की दो प्रतियों के साथ समाप्त हो सकते हैं - पुराने स्थान पर और नए पर।
strace mv /fs1/dir /fs2/
- बहुत आखिरी बात एमवी करता है unlinkat
सभी स्रोत फ़ाइलों को एक बार में बुला रहा है (एक-एक करके नहीं जैसा कि वे कॉपी किए जाते हैं)।
GNU कार्यान्वयन कमांड लाइन पर तर्कों पर ध्यान केंद्रित करता है, पहले नाम बदलने का प्रयास करता है, और, यदि यह विफल रहता है, तो पुनरावर्ती प्रतियां और फिर पुन: स्रोत को हटा देता है। इसलिए
mv a b c/
को नष्ट करेगा एक कॉपी करने से पहले ख , और में कुछ भी हटाए शुरू नहीं होगी एक से पहले गंतव्य प्रतिलिपि पूरा हो गया है।
ध्यान दें कि यह केवल GNU कार्यान्वयन पर लागू होता है।
स्पष्ट करने के लिए: यदि एक डी और ई युक्त निर्देशिका है , और बी एक फ़ाइल है, तो आदेश होगा
mv
साथ भी है, इसलिए यह केवल जीएनयू नहीं है।
आप एक निर्देशिका को स्थानांतरित करते हैं, इस कदम को बाधित करते हैं, और मूल निर्देशिका बरकरार रहेगी:
$ mv a b/
यदि आप कई निर्देशिकाओं को आगे बढ़ाते हैं, तो हर एक स्रोत या गंतव्य पर बरकरार रहेगा, जो आपके बाधित होने पर निर्भर करता है:
$ mv a b c/
मुझे अपना जवाब कैसे मिला:
$ mv --version
mv (GNU coreutils) 8.21
$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals. If the copy fails, then the part
that was copied to the destination partition is removed. If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.
एक परीक्षण के रूप में, मैंने एक बड़े फ़ोल्डर को एनएफएस निर्देशिका में कॉपी किया, बाधित किया, और मेरे स्रोत बड़े फ़ोल्डर में फ़ाइलों की संख्या समान रही, और आंशिक सामग्री एनएफएस निर्देशिका पर छोड़ दी गई। मैंने सत्यापित करने के लिए "Find -type f | wc -l" का उपयोग किया।
लगता है कि साइमन का जवाब सही है।
फ़ाइल सिस्टम के बीच बढ़ने के बारे में स्वीकार किया गया उत्तर निश्चित रूप से गलत है - एक ऐसा तथ्य जिसने मुझे कई बार पहले से ही बहुत परेशानी से बचाया। उपनिर्देशिका वाली निर्देशिका को ले जाते समय, उपनिर्देशिका की कोई भी फ़ाइल पूरी उपनिर्देशिका को कॉपी करने से पहले हटा दी जाएगी। यह, "ऑब्जेक्ट द्वारा ऑब्जेक्ट" का वास्तविक अर्थ है btw.the - एक उपनिर्देशिका एक ऑब्जेक्ट (फ़ाइल) है और इस प्रकार कुछ भी नष्ट होने से पहले इसकी अखंडता को गंतव्य पर एक पूर्ण प्रतिलिपि द्वारा संरक्षित किया जाना है। इसलिए साइमन का जवाब मुझे सही लगता है।
सं। Mv ऑब्जेक्ट द्वारा ऑब्जेक्ट को संचालित करता है, इसलिए जिन वस्तुओं को पहले से संसाधित किया गया है, उन्हें स्रोत से हटा दिया जाएगा।
निश्चित रूप से नहीं। चाल को वस्तु द्वारा वस्तु बनाया जाता है। इसलिए, रुकावट के बिंदु तक गंतव्य के लिए ले जाया गया ऑब्जेक्ट स्रोत में मौजूद नहीं होगा।
यदि mv को एक बड़ी फ़ाइल (अलग-अलग) के लिए जारी किया गया था और इसे बाधित किया गया है, तो स्रोत बरकरार रहेगा। लक्ष्य पर आपको रुकावट के बिंदु तक एक अधूरी फ़ाइल दिखाई देगी।
हालाँकि आप mv को उसी कमांड से रिस्टोर कर सकते हैं और यह प्रक्रिया जारी रहेगी।
यदि आप एमवी को बाधित करना चाहते हैं क्योंकि आप टर्मिनल से डिस्कनेक्ट करना चाहते हैं, तो आप इसे पृष्ठभूमि में भेज सकते हैं:
* press Ctrl+Z
# bg
# disown
fsck
(जो कि रिबूट पर स्वचालित रूप से चलने की संभावना होगी, क्योंकि डिस्क को साफ नहीं किया गया था)।