यदि एमवी बाधित होता है तो क्या होता है?


72

लिनक्स mvकमांड बाधित होने पर क्या होता है? कहो, मैं एक पूरी निर्देशिका को किसी अन्य स्थान पर ले जा रहा हूं और चलते समय इसे बाधित कर रहा हूं। क्या स्रोत निर्देशिका अभी भी अछूती रहेगी?

जवाबों:


51

यदि आप एक ही फ़ाइल सिस्टम पर एक निर्देशिका को स्थानांतरित करते हैं , तो आप केवल फ़ाइल सिस्टम में एक स्थान से दूसरे में निर्देशिका प्रविष्टि को स्थानांतरित करते हैं। उदाहरण के लिए, mv /source/dir /target/dirकी निर्देशिका प्रविष्टि को नष्ट करेगा dirसे /sourceऔर में एक नया बना /target। यह एक परमाणु प्रणाली कॉल (यानी, अबाधित) द्वारा किया जाता है। डायरेक्ट्री प्रविष्टियों के dirसाथ ही डायरेक्टरी की वास्तविक सामग्री से जुड़े इनोड प्रभावित नहीं होते हैं।

यदि आप निर्देशिका को एक फ़ाइल सिस्टम से दूसरे में स्थानांतरित करते हैं , तो सभी फाइलें पहले नई फाइल सिस्टम में कॉपी की जाती हैं और फिर मूल एक से अनलिंक की जाती हैं। इसलिए यदि आप mvइसे कॉपी करते समय बाधित करते हैं, तो आप कुछ फ़ाइलों की दो प्रतियों के साथ समाप्त हो सकते हैं - पुराने स्थान पर और नए पर।


6
@Wesley: नहीं, कोई आंशिक फ़ाइल नहीं होगी। यदि सिस्टम ऊपर रहता है (उदाहरण के लिए, आपने ctrl-C मारा है), तो यह स्वचालित रूप से हटा दिया जाएगा। यदि नहीं (उदाहरण के लिए, बिजली की हानि), तो आंशिक फ़ाइल को गंतव्य डिस्क पर दुर्गम में कहीं छोड़ दिया जा सकता है, लेकिन अगले द्वारा साफ किया जाना चाहिए fsck(जो कि रिबूट पर स्वचालित रूप से चलने की संभावना होगी, क्योंकि डिस्क को साफ नहीं किया गया था)।
डेव शेरोहमान

50
गलत। यदि आप dir को एक fs से दूसरे mv / fs1 / dir / fs2 / पर ले जाते हैं और आप व्यवधान डालते हैं, / fs1 / dir / पूरी तरह से यहाँ रहेगा। / fs1 / dir केवल तभी निकाला जाता है जब चाल पूरी हो जाती है।

8
user263131 सही है। भागो strace mv /fs1/dir /fs2/- बहुत आखिरी बात एमवी करता है unlinkatसभी स्रोत फ़ाइलों को एक बार में बुला रहा है (एक-एक करके नहीं जैसा कि वे कॉपी किए जाते हैं)।
जैकब

7
@ जेजे ऐसा लगता है क्योंकि आपने बैश विस्तार का उपयोग किया है, इस मामले में एमवी विस्तार में प्रत्येक फ़ाइल को एक अलग स्रोत के रूप में मानता है (इस प्रकार उन्हें व्यक्तिगत रूप से कर रहा है)।
गुरुवर १war

5
तो .... @bmk या अन्य, क्या आप इस उत्तर को कमतर अपडेट करना चाहते हैं ... गलत?
आर्टेम रसाकोवस्की

35

GNU कार्यान्वयन कमांड लाइन पर तर्कों पर ध्यान केंद्रित करता है, पहले नाम बदलने का प्रयास करता है, और, यदि यह विफल रहता है, तो पुनरावर्ती प्रतियां और फिर पुन: स्रोत को हटा देता है। इसलिए

mv a b c/

को नष्ट करेगा एक कॉपी करने से पहले , और में कुछ भी हटाए शुरू नहीं होगी एक से पहले गंतव्य प्रतिलिपि पूरा हो गया है।

ध्यान दें कि यह केवल GNU कार्यान्वयन पर लागू होता है।

स्पष्ट करने के लिए: यदि एक डी और युक्त निर्देशिका है , और बी एक फ़ाइल है, तो आदेश होगा

  • c / a बनाएँ
  • a / d -> c / a / d कॉपी करें
  • a / e -> c / a / e की प्रतिलिपि बनाएँ
  • हटाएं / a
  • हटाएं / ए
  • हटाएं
  • कॉपी बी -> सी / बी
  • हटाएँ b

1
क्या आप इसके लिए कोई स्रोत प्रदान कर सकते हैं? अन्य उत्तरदाता कह रहे हैं कि स्रोत फ़ाइल को किसी भिन्न fs पर कॉपी किए जाने के तुरंत बाद हटा दिया जाता है (अर्थात सभी प्रतिलिपि नहीं की जाती हैं तो सभी हटा दी जाती हैं)।

1
अनुभव। मैंने इसे और स्पष्ट करने के लिए एक उदाहरण जोड़ा है कि मेरा उत्तर और अन्य कैसे सुसंगत हैं। यदि आप केवल व्यक्तिगत फ़ाइलों को सूचीबद्ध करते हैं तो वास्तव में प्रत्येक फ़ाइल को तुरंत हटा दिया जाएगा।
साइमन रिक्टर

मैं macOS पर इस उत्तर में वर्णित व्यवहार का निरीक्षण करता हूं, जो कि बीएसडी के mvसाथ भी है, इसलिए यह केवल जीएनयू नहीं है।
किर्लगिन

12

आप एक निर्देशिका को स्थानांतरित करते हैं, इस कदम को बाधित करते हैं, और मूल निर्देशिका बरकरार रहेगी:

$ 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" का उपयोग किया।

लगता है कि साइमन का जवाब सही है।


9

फ़ाइल सिस्टम के बीच बढ़ने के बारे में स्वीकार किया गया उत्तर निश्चित रूप से गलत है - एक ऐसा तथ्य जिसने मुझे कई बार पहले से ही बहुत परेशानी से बचाया। उपनिर्देशिका वाली निर्देशिका को ले जाते समय, उपनिर्देशिका की कोई भी फ़ाइल पूरी उपनिर्देशिका को कॉपी करने से पहले हटा दी जाएगी। यह, "ऑब्जेक्ट द्वारा ऑब्जेक्ट" का वास्तविक अर्थ है btw.the - एक उपनिर्देशिका एक ऑब्जेक्ट (फ़ाइल) है और इस प्रकार कुछ भी नष्ट होने से पहले इसकी अखंडता को गंतव्य पर एक पूर्ण प्रतिलिपि द्वारा संरक्षित किया जाना है। इसलिए साइमन का जवाब मुझे सही लगता है।



2

निश्चित रूप से नहीं। चाल को वस्तु द्वारा वस्तु बनाया जाता है। इसलिए, रुकावट के बिंदु तक गंतव्य के लिए ले जाया गया ऑब्जेक्ट स्रोत में मौजूद नहीं होगा।

यदि mv को एक बड़ी फ़ाइल (अलग-अलग) के लिए जारी किया गया था और इसे बाधित किया गया है, तो स्रोत बरकरार रहेगा। लक्ष्य पर आपको रुकावट के बिंदु तक एक अधूरी फ़ाइल दिखाई देगी।

हालाँकि आप mv को उसी कमांड से रिस्टोर कर सकते हैं और यह प्रक्रिया जारी रहेगी।


2

यदि आप एमवी को बाधित करना चाहते हैं क्योंकि आप टर्मिनल से डिस्कनेक्ट करना चाहते हैं, तो आप इसे पृष्ठभूमि में भेज सकते हैं:

* press Ctrl+Z

# bg
# disown

1
यह एक अच्छी बात है लेकिन यह वास्तविक सवाल का जवाब नहीं देता है।
जूली पेलेटियर

1
@JuliePelletier, लेकिन यही तो मैं किसी को खोज रहा था, ऐसा करने में दिलचस्पी हो सकती है।
Курочка Ряба
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.