मैं एक खराब फाइल पथ के लिए "mv" एड 49GB निर्देशिका है, क्या फाइलों की मूल स्थिति को पुनर्स्थापित करना संभव है?


58

मेरे पास (अच्छी तरह से, मेरे पास ) एक निर्देशिका है:

/media/admin/my_data

यह आकार में लगभग 49GB था और इसमें हजारों फाइलें थीं। निर्देशिका एक सक्रिय LUKS विभाजन का आरोह बिंदु है।

मैं निर्देशिका का नाम बदलना चाहता था:

/media/admin/my_data_on_60GB_partition

मुझे उस समय एहसास नहीं हुआ, लेकिन मैंने होम डाइरेक्टरी से कमांड जारी की, इसलिए मैंने यह करना समाप्त कर दिया:

~% sudo mv /media/admin/my_data my_data_on_60GB_partition

तो फिर mvकार्यक्रम शुरू हुआ /media/admin/my_dataऔर इसकी सामग्री एक नई निर्देशिका के लिए ~/my_data_on_60GB_partition

मैंने कमांड पार्ट का तरीका रद्द करने के लिए Ctrl+ Cका उपयोग किया , इसलिए अब मेरे पास निर्देशिकाओं में विभाजित फ़ाइलों का एक पूरा गुच्छा है:

~/my_data_on_60GB_partition    <---  about 2GB worth files in here

तथा

/media/admin/my_data           <---- about 47GB of orig files in here    

नई निर्देशिका ~/my_data_on_60GB_partitionऔर इसके कुछ उपनिर्देशिकाएँ रूट के स्वामित्व में हैं।
मैं मान रहा हूं कि mvप्रोग्राम ने शुरुआत में फ़ाइलों को रूट के रूप में कॉपी किया होगा और फिर ट्रांसफर के बाद chownउन्हें मेरे उपयोगकर्ता खाते में वापस भेज दिया।

मेरे पास निर्देशिका / विभाजन का कुछ पुराना बैकअप है।
मेरा सवाल है, क्या यह संभव है कि स्थानांतरित की गई फ़ाइलों के गुच्छा को मज़बूती से बहाल किया जाए?

यही है, क्या मैं बस चला सकता हूं:

sudo mv ~/my_data_on_60GB_partition/*  /media/admin/my_data

या क्या मुझे पुनर्प्राप्त करने की कोशिश करनी चाहिए, क्योंकि फाइलें संभवतः दूषित हैं और आंशिक रूप से पूर्ण हैं, आदि?

  • ओएस - उबंटू 16.04
mv --version  
mv (GNU coreutils) 8.25

36
पैन करने के Control-Zबजाय टाइप करने के लिए (रुकने के लिए) आदत में जाओ Control-C। इस स्थिति में, आप यह देख पाएंगे कि उस समय कौन सी फ़ाइल स्थानांतरित की जा रही थी और इसलिए यह जानें कि कौन सी फ़ाइल आंशिक रूप से कॉपी की गई थी। फिर आप शांति से तय कर सकते हैं कि आगे कैसे बढ़ना है। ( kill -stopTty में नहीं प्रक्रियाओं के लिए उपयोग करें )।
18

1
2GB + 47GB = 60GB ???
tbodt

7
@tbodt (2GB + 47GB) < 60GB। विभाजन क्षमता 60GB, फ़ोल्डर का आकार और इसकी सामग्री: 49GB है।
the_velour_fog

जवाबों:


87

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

चीजों को वापस ले जाने के लिए, -iध्वज जोड़ें ताकि mvकुछ भी अधिलेखित न हो:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

(मान लें कि आपके पास पुनर्स्थापित करने के लिए कोई छिपी हुई फ़ाइल नहीं है ~/my_data_on_60GB_partition/), या बेहतर अभी तक (यह देखते हुए, जैसा कि आपने खोजा था, आपके पास नष्ट होने की प्रतीक्षा में कई फाइलें हो सकती हैं), -nध्वज जोड़ें ताकि mvकुछ भी अधिलेखित न हो लेकिन आप इसके बारे में पूछें:

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/

आप यह -vदेखने के लिए ध्वज भी जोड़ सकते हैं कि क्या किया जा रहा है।

किसी भी POSIX अनुरूप के साथ mv, मूल निर्देशिका संरचना अभी भी बरकरार होना चाहिए, इसलिए वैकल्पिक रूप से आप कि जांच कर सकता है - और बस को नष्ट /media/admin/my_data... (सामान्य स्थिति में, हालांकि, मुझे लगता है कि mv -nसंस्करण सुरक्षित तरीका है - यह के सभी रूपों को संभालती है mv, उदाहरण सहित mv /media/admin/my_data/* my_data_on_60GB_partition/।))

आपको शायद कुछ अनुमतियां बहाल करने की आवश्यकता होगी; आप ऐसा कर सकते हैं कि आप मैस का उपयोग कर रहे हैं chownऔर chmod, या बैकअप से उन्हें पुनर्स्थापित कर सकते हैं ( getfaclऔर अनुस्मारक के लिए सातो कैटसुरा के लिए setfaclधन्यवाद )।


धन्यवाद स्टीफन किट, एक बहुत बड़ी मदद! मैं findअनुमतियों को खोजने और सेट करने के लिए उपयोग कर सकता हूं । नई निर्देशिका में फ़ाइलों का एक बहुत कुछ है जो फ़ाइल नाम में स्थान है, लेकिन कोई छिपी हुई फ़ाइलें नहीं हैं - जो मुझे पता है। क्या आपको लगता है कि कमांड में ग्लोब sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/शब्द विभाजन के मुद्दों के बिना फ़ाइल नाम का विस्तार करेगा? मैं वैकल्पिक रूप से सोच रहा था कि मैं उपयोग कर सकता हूं sudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/जो मुझे लगता है कि रिक्त स्थान के साथ फ़ाइल पथ संभाल लेंगे?
the_velour_fog

6
बस निश्चित रूप से, जब ओपी वर्णित चीजें होती हैं, तो मैं rsyncइसके बजाय उपयोग करता हूं , इसलिए यह सभी फाइलों की अखंडता की भी जांच करेगा। लेकिन यह जानना अच्छा है कि मुझे इसकी आवश्यकता नहीं है।
हौलेथ

1
@the_velour_fog ग्लोबिंग मुद्दों के बिना फ़ाइल नाम में रिक्त स्थान को संभालता है।
स्टीफन किट

5
मैं su command mv -i ...(या su /bin/mv -i ...), के बजाय sudo mv -i ...), मामले में कुछ (अजीब) व्यवस्थापक ने "mv" को एक फ़ंक्शन बनाया जो सिस्टम स्तर पर "mv -f" करता है (यानी, / etc / प्रोफ़ाइल या इस तरह की सिस्टम चौड़ी फाइलें)। : कमांड कुछ: कमांड को शुरू करना, और एक फ़ंक्शन या एक ही नाम का उपनाम नहीं। (पूर्व के लिए: एक हो सकता है (बहुत!) बदकिस्मत और एक (बहुत, बहुत बुरा!) function mv { /bin/mv -f -- "$@" }एक फ़ाइल में जो हमेशा खट्टा होता है, और फिर "आरएम-आई कुछ" कुछ भी नहीं पूछेगा (और बस विरोध है कि "-आई "फ़ाइल मौजूद नहीं है!) ... [मैंने ऐसी चीजें देखी हैं ... कंपकंपी ]
ओलिवियर डुलैक

3
@OlivierDulac - मानक कार्यक्रमों के समान नामों के साथ उपनाम या स्क्रिप्ट का उपयोग करने के लिए बुरा व्यवहार क्यों है इसका एक आदर्श उदाहरण है।
जो

19

स्टीफन किट के उत्तर पाने और संभावित समाधान के रूप में इस कमांड पर चर्चा करने के बाद:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

मैंने इसे चलाने का फैसला किया जब तक कि मुझे अपना सिर नहीं मिला जब तक यह नहीं हो रहा था, यह उत्तर बताता है कि मैंने क्या पाया और क्या कर रहा था।

मैं ग्नू का उपयोग कर रहा हूं, mvजो फ़ाइलों को लक्ष्य में कॉपी करता है, उसके बाद ही यदि कॉपी ऑपरेशन सफल होता है, तो यह मूल को हटा देता है।
हालाँकि मैं mvइस बात की पुष्टि करना चाहता था कि क्या यह अनुक्रम एक समय में एक फ़ाइल करता है, अगर यह सच था, तो मूल फ़ोल्डर सामग्री को दो भागों में साफ कर दिया जाएगा, एक भाग गंतव्य पर स्थानांतरित हो गया, दूसरा अभी भी स्रोत पर पीछे रह गया। और संभवतः एक फाइल होगी जो कॉपी के दौरान बाधित हुई थी जो दो निर्देशिकाओं के बीच आम होगी - और यह संभवतः विकृत होगी।

उन फ़ाइलों की खोज करने के लिए जो दो निर्देशिकाओं के बीच सामान्य थीं, मैं भाग गया:

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237

यह परिणाम सुझाया गया कि स्रोत और लक्ष्य निर्देशिका दोनों में एक ही फ़ाइलों के 14,237 उदाहरण हैं, मैंने फ़ाइलों की मैन्युअल रूप से जाँच करके पुष्टि की है - हाँ दोनों निर्देशिकाओं में समान फ़ाइलों के कई थे। इससे पता चलता है कि केवल mvबड़ी फ़ाइलों की प्रतिलिपि बनाने के बाद ही यह स्रोत फ़ाइलों को हटाने का कार्य करता है। कमांड infoपर एक त्वरित लुकअप mvदिखाया गया

यह [ mv] पहले कुछ समान कोड का उपयोग cp -aकरता है जो अनुरोधित निर्देशिकाओं और फ़ाइलों की प्रतिलिपि बनाने के लिए उपयोग किया जाता है , फिर (प्रतिलिपि को सफल मानकर) यह मूल को हटा देता है। यदि प्रतिलिपि विफल हो जाती है, तो गंतव्य विभाजन पर कॉपी किया गया भाग हटा दिया जाता है।

मैंने कमांड नहीं चलाया, लेकिन मुझे संदेह है कि अगर मैंने चलाने की कोशिश की

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

-i शीघ्र से पहले ऊपर लिख संभावना 14,000 से अधिक बार ट्रिगर होता।

तो फिर यह जानने के लिए कि नई बनाई गई निर्देशिका में कुल कितनी फाइलें हैं:

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238

तो फिर अगर नई निर्देशिका में कुल 14238 नियमित फाइलें थीं और 14237 स्रोत में समान मूल वापस थीं, तो इसका मतलब है कि नई निर्देशिका में केवल एक फ़ाइल थी जो स्रोत पर एक समान फ़ाइल वापस नहीं थी। यह जानने के लिए कि वह फ़ाइल क्या थी, मैं स्रोत की दिशा में वापस rsync चला गया:

~% sudo rsync -av --dry-run my_data_on_60GB_partition/ /media/admin/my_data
sending incremental file list
./
Education_learning_reference/
Education_learning_reference/Business_Education/
Education_learning_reference/Business_Education/Business_education_media_files/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/018 business plans-identifying main KPIs.flv

sent 494,548 bytes  received 1,881 bytes  330,952.67 bytes/sec
total size is 1,900,548,824  speedup is 3,828.44 (DRY RUN)

एक त्वरित जाँच ने पुष्टि की कि यह विकृत फ़ाइल थी, जहाँ फ़ाइल स्रोत और गंतव्य, गंतव्य फ़ाइल = 64MB, मूल = 100MB दोनों पर मौजूद थी। यह फ़ाइल और इसकी निर्देशिका पदानुक्रम अभी भी रूट के स्वामित्व में थी और अभी तक मूल अनुमतियाँ बहाल नहीं हुई थीं।

तो संक्षेप में:

  • सभी फाइलें जो mvकभी नहीं पहुंची थीं, वे अभी भी अपने मूल स्थानों में वापस हैं (जाहिर है)
  • mvपूरी तरह से कॉपी करने वाली सभी फाइलें अभी भी स्रोत निर्देशिका में अपनी मूल प्रतियां थीं
  • फ़ाइल जो केवल आंशिक रूप से कॉपी की गई थी, अभी भी मूल निर्देशिका में वापस आ गई है

दूसरे शब्दों में, सभी मूल फाइलें अभी भी बरकरार थीं और इस मामले में समाधान केवल नई निर्देशिका को हटाना था!


वाह ... मैंने अपना जवाब अपडेट कर दिया है, -nसामान्य मामले में बेहतर होगा। मैंने mvस्रोत कोड की जाँच की , यह एक समय में स्रोत एक तर्क को हटा देता है।
स्टीफन किट

@StephenKitt आह अच्छा। मैं सोच रहा था कि mvस्रोत पर विलोपन कब होता है। तो आदेश mv foo bar bazकदम होगा fooकरने के लिए baz/foo तो मूल को नष्ट fooतो ले जाने के barलिए baz/bar..?
the_velour_fog

हाँ य़ह सही हैं; वास्तव में यही वह है जो POSIX निर्दिष्ट करता है (मूल रूप से, ताकि किसी भी स्रोत तर्क को प्रभावित करने वाली कोई भी त्रुटि पूरे स्रोत पदानुक्रम को छोड़ दे)।
स्टीफन किट

मुझे लगता है कि आप एक अधूरी फाइल को भी खोजने के लिए अलग-अलग इस्तेमाल कर सकते थे।
StarWeaver

1
आपको बाइनरी फ़ाइलों की तुलना करने के cmpबजाय उपयोग करना चाहिए diff। इसके अलावा, ऊपर दी गई आपकी चर्चा केवल तभी समझ में आती है जब अलग-अलग फाइल सिस्टम में फाइलें चलती हैं। एक ही फाइल सिस्टम में फाइलों को ले जाने पर कोई नकल शामिल नहीं है।
सातु कटसुरा

4

मुझे लगा कि मैं टिप्पणी करूंगा कि कुछ लोग समानांतर में चीजों को चलाने के लिए 'xargs' को मिश्रण में उछाल सकते हैं। इससे मुझे वसीयत मिलती है और मैं वास्तव में ऊपर rsync समाधान पसंद करता हूं।

जैसा कि फाइलसिस्टम सामान को स्थानांतरित करने और कॉपी करने के बारे में है और जब वास्तव में मूल हटा दिया जाता है, तो वीएफएस और अंतर्निहित फाइलसिस्टम उस डिलीट स्टेप को प्राप्त करने से पहले प्रति-फ़ाइल परमाणु की गारंटी के लिए समन्वय करते हैं। तो भले ही यह टारगेट फाइल पूरी तरह से लिखे जाने से पहले बाधित हो जाए, वीएफएस में लॉकिंग वास्तविक सख्त है और समानांतर मामलों में भी रैंडम डेटा इंटरलेइंग जैसे सामान से बचाता है। (मैंने लिनक्स VFS और NFS4 सामान पर काम किया)

मिश्रण में 'xargs' जोड़ने से संभवत: दोहरे संन्यास-जाँच कदम ने सिरदर्द बना दिया होगा, जिसमें मध्य-पारगमन में कई फाइलें होंगी। काश मेरे पास और सिस्टम लेवल-स्क्रिप्टिंग होती। मेरे लिए अच्छा अनुस्मारक!

सवाल पसंद है, कोबवे के लिए अच्छा है, और मुझे फिर से rsync से प्यार है। चीयर्स!


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