अनुमतियों को संरक्षित किए बिना किसी फ़ाइल को कैसे स्थानांतरित किया जाए


42

समस्या यह है कि मैं फ़ाइल ले जाते समय त्रुटियों को देखने में सक्षम होना चाहता हूं, लेकिन अनुमतियों की समस्या के साथ त्रुटियों को नहीं देख सकता। दूसरे शब्दों में - मुझे परवाह है कि यदि फ़ाइल पूरी तरह से प्रसारित नहीं होती है, लेकिन इस तरह की त्रुटियां नहीं देखना चाहते हैं:

mv: '/home/blah/backup/pgsql.tar.gz' के लिए स्वामित्व संरक्षित करने में विफल: ऑपरेशन की अनुमति नहीं है

इसलिए मैं कुछ ऐसा करना चाहते हैं: mv $backupfile $destination --ignore-permissions

बैकअप फ़ाइल 1 MiB से 5 GiB तक कुछ भी हो सकती है और इसे NFS के माध्यम से स्थानांतरित किया जाता है।


यह कनेक्टेड NTFS डिवाइस पर भी होता है, लेकिन यह एकमात्र मामला नहीं है। यह सभी मामलों में होता है कि आपके पास अनुमतियाँ बदलने के अधिकार नहीं हैं या यह संभव नहीं है (जैसे NTFS पर)।
नक्स

यह उन फ़ाइलों को स्थानांतरित करने की कोशिश करते समय उपयोगी होता है जो किसी भी तरह अनुमतियों की त्रुटियों के कारण स्थानांतरित नहीं होते हैं (उदाहरण के लिए क्योंकि वे माउंट किए जाते हैं cifs)।
श्रीधर सरनोबत

जवाबों:


56

mvइस काम के लिए गलत उपकरण है; आप चाहते हैं cpऔर फिर rm। चूंकि आप फ़ाइल को किसी अन्य फाइल सिस्टम में ले जा रहे हैं, यह ठीक mvवैसे ही है जो पर्दे के पीछे कर रहा है, इसके अलावा mvफाइल अनुमति बिट्स और मालिक / समूह की जानकारी को संरक्षित करने का भी प्रयास किया जा रहा है। ऐसा इसलिए है क्योंकि mvअगर यह एक ही फाइलसिस्टम के अंदर एक फाइल को आगे बढ़ा रहा है तो यह जानकारी संरक्षित करेगा और mvदोनों स्थितियों में एक ही तरह से व्यवहार करने की कोशिश करेगा। चूंकि आप फ़ाइल अनुमति बिट्स और स्वामी / समूह जानकारी के संरक्षण के बारे में परवाह नहीं करते हैं, इसलिए उस टूल का उपयोग न करें। उपयोग करें cp --no-preserve=modeऔर rmइसके बजाय।


5
धन्यवाद, यह काम करता है। समाप्त करना:, cp --no-preserve=mode,ownership $backupfile $destinationबाहर निकलने के कोड की जाँच करें और फिर rm $backupfileसब कुछ ठीक होने पर करें।
नक्स

22

जब आप एक फ़ाइल को उसी फाइल सिस्टम में स्थानांतरित करते हैं, mvतो फ़ाइल को उसके पुराने स्थान से अलग कर देता है और उसे उसके नए स्थान पर संलग्न कर देता है; मेटाडेटा जैसे कि अनुमतियाँ समान रहती हैं। जब आप किसी फ़ाइल को किसी भिन्न फ़ाइल सिस्टम में ले जाते हैं, mvतो फ़ाइल की प्रतिलिपि बनाता है, जितना संभव हो उतना मेटाडेटा को दोहराने का प्रयास करता है, और मूल को निकालता है।

चूंकि आप एक अलग फाइल सिस्टम में जा रहे हैं और आप ज्यादा मेटाडेटा को दोहराना नहीं चाहते हैं, इसलिए आप फाइल को कॉपी कर सकते हैं और फिर मूल को हटा सकते हैं।

cp "$backupfile" "$destination" && rm "$backupfile"

यह फ़ाइल की अनुमतियों को कुछ हद तक संरक्षित करता है (उदाहरण के लिए विश्व-पठनीयता, निष्पादन)। फ़ाइल का संशोधन समय संरक्षित नहीं है। जीएनयू केcp साथ , आप --preserve=…विकल्प का उपयोग कर सकते हैं कि क्या मेटाडेटा को अधिक सूक्ष्मता से दोहराया जाता है, जैसे --preserve=mode,timestamps

आप इसका उपयोग भी कर सकते हैं rsyncऔर बता सकते हैं कि आप क्या संरक्षित करना चाहते हैं। विकल्प का -aअर्थ है "अधिकांश मेटाडेटा को संरक्षित करना", जिसमें केवल रूट के रूप में चलने पर मालिक शामिल है।

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"

rsyncसमाधान उत्कृष्ट काम करता है। मैं अपने पुराने ubuntu CIFS शेयर को स्थापित करने की कोशिश कर रहा था। मेरे rsync ने फ़ाइल को स्थानांतरित करने में विफलता की रिपोर्ट नहीं की, लेकिन वह इसे स्थानांतरित नहीं कर रहा था और केवल अनुमतियों की समस्याओं की रिपोर्ट कर रहा था।
श्रीधर सरनोबत

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