यूनिक्स एमवी प्रोग्राम को निर्देशिकाओं के लिए -R (पुनरावर्ती) विकल्प की आवश्यकता क्यों नहीं है लेकिन cp को इसकी आवश्यकता है?


58

मुझे हमेशा गड़बड़ हो जाती है जब उपयोग करने की आवश्यकता होती है cpया mv: "क्या मुझे -Rधीरज के साथ काम करते समय विकल्प की आवश्यकता है?" जीएनयू में कोर्यूटिल्स की cpजरूरत होती है -Rऔर mvनहीं भी।

मुझे अभी कोई कारण नहीं मिल रहा है कि डायर की प्रतिलिपि बनाने के विकल्प की cpआवश्यकता क्यों है -Rऔर mvक्या नहीं। मुझे लगता है कि cpबिना आईएनजी डायर -R(लेकिन वहाँ की तरह पुनरावृत्ति का व्यवहार करना -Rऔर mvकरता है) टूल का उपयोग करने पर किसी की आदतों को तोड़ने के अलावा कोई समस्या नहीं होगी।

क्या आप कोई स्पष्टीकरण जानते हैं? क्या यह बहुत पहले एक कारण हो सकता है?


अतिरिक्त प्रश्न: क्यों नहीं Coreutils डेवलपर्स cpप्रतिलिपि डायरियों को डिफ़ॉल्ट रूप से पुनरावर्ती बनाते हैं ?

जवाबों:


45

एक निर्देशिका है (वैचारिक रूप से) एक विशेष "फ़ाइल" जिसमें नामों की एक सूची होती है, और इन नामों की संख्या उन नामों को इंगित करती है। कुछ नाम उपनिर्देशिका हो सकते हैं। एक विशेष प्रविष्टि है ..जो मूल निर्देशिका की ओर इशारा करती है।

तो, इसकी स्पष्ट, फ़ाइल का नाम बदलना आसान है: आप केवल निर्देशिका प्रविष्टि में नाम बदलते हैं, और कुछ नहीं। यह मानता है कि फ़ाइल वास्तव में एक फ़ाइल है, या किसी अन्य निर्देशिका की सामग्री को संग्रहीत करने के लिए उपयोग की जाने वाली "फ़ाइल" है। दरअसल, एक ही renamesyscall दोनों करता है।

हालांकि, नकल करना बहुत कम तुच्छ कार्य है। आप बस निर्देशिका "फ़ाइल" की प्रतिलिपि बना सकते हैं , लेकिन फिर आपके पास दो निर्देशिकाएं होंगी जहां फाइलें समान हैं (वे हार्डलिंक होंगे)। यदि आपके पास एक ऐसी प्रणाली है जो निर्देशिकाओं को हार्डलिंक की अनुमति देती है, तो वे होंगे, लेकिन चूंकि कोई भी आधुनिक प्रणाली इसकी अनुमति नहीं देती है, कम से कम गैर-रूट के लिए, आपको प्रत्येक उपनिर्देशिका के लिए उस प्रति को करना होगा। आप वास्तव में cpइस व्यवहार के लिए पूछ सकते हैं cp -lR: -lकड़ी के लिए, -Rउस पुनरावृत्ति के लिए।

लेकिन सब कुछ जुड़ा हुआ छोड़ने की संभावना नहीं है कि आप क्या चाहते हैं। इसके बजाय, आप cpप्रत्येक फ़ाइल की प्रतिलिपि बनाना चाहते हैं । यह काफी महंगा ऑपरेशन है: प्रत्येक फ़ाइल को मेमोरी में पढ़ा जाना चाहिए, और दूसरे स्थान पर डिस्क पर वापस लिखा जाना चाहिए। यह वास्तव में फ़ाइलों को खोलने, पढ़ने, लिखने और बंद करने के लिए कई syscalls लेता है, और जिसे प्रत्येक फ़ाइल के लिए दोहराया जाना है।

पारंपरिक फाइल सिस्टम डिस्क पर भी इस तरह से काम करते हैं। फ़ाइलों के एक समूह को कॉपी करने का कोई तरीका नहीं है, अन्य के अलावा हर एक को व्यक्तिगत रूप से जाने और इसे कॉपी करने के लिए, और उन प्रकार के फाइल सिस्टम हैं जो मूल कमांड लाइन उपयोगिताओं के डिजाइन किए जाने के समय उपयोग में थे।


क्या mvएक फाइल सिस्टम से दूसरे में समान "सिर्फ डायरेक्टरी एंट्री में नाम बदलते हैं"?
rslnx 13

5
नहीं, क्रॉस-फाइलसिस्टम एक कॉपी + डिलीट के रूप में ही है (वास्तव में, renameक्रॉस-फाइल सिस्टम के लिए syscall विफल हो जाएगा)। यकीन नहीं तो, ऐतिहासिक रूप से, mvयहां तक ​​कि समर्थित क्रॉस-एफएस मूव्स भी।
derobert

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

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

1
@derobert, यह (क्रॉस-फाइलसिस्टम mvने केवल वैक्स पर बीएसडी 4.2 पर व्यक्तिगत फ़ाइलों के लिए काम नहीं किया)।
वॉनब्रांड

21

मुझे एक और प्रश्न पूछकर शुरू करना चाहिए:

बीच क्या अंतर है cpऔर cp -R?

खैर, -Rझंडे के बिना , केवल फाइलों को कॉपी करना संभव है, क्योंकि यह असामान्य है कि कोई व्यक्ति गैर-पुनरावर्ती रूप से एक निर्देशिका की प्रतिलिपि बनाना चाहता है: एक गैर-पुनरावर्ती प्रतिलिपि बस निर्देशिका के लिए एक दूसरे नाम का परिणाम देगा, सीधे उसी निर्देशिका की ओर इशारा करते हुए संरचना। क्योंकि शायद ही कभी लोग क्या चाहते हैं, और वास्तव में एक अलग कार्यक्रम है जो ऐसा करता है ( ln), निर्देशिका की एक गैर-पुनरावर्ती प्रतिलिपि की अनुमति नहीं है।

तब mvऔर mv -Rक्या अंतर हो सकता है ?

mv a bबस निर्देशिका में एकल प्रविष्टि का नाम बदल देता है, इसलिए यदि कोई निर्देशिका mvसंपादित होती है, तो इसकी सामग्री स्वचालित रूप से स्थानांतरित हो जाती है। उस अर्थ में, mvपहले से ही पुनरावर्ती संपत्ति, अर्थात् नामांकित निर्देशिका में सभी प्रविष्टियों का "नामकरण", जैसे से a/1प्रदान करता है b/1। A mvऐसा नहीं करता है, अर्थात, जो किसी निर्देशिका aका नाम बदल देता है b, लेकिन a/1जैसा कि रखता है a/1, वैसा नहीं है जब लोग किसी चीज़ को स्थानांतरित करने का संदर्भ देते हैं: जब आप किसी अलमारी को स्थानांतरित करते हैं, तो अलमारी की सामग्री को भी स्थानांतरित कर दिया जाता है। यह अन्य ऑपरेशन, एक निर्देशिका को अपनी सामग्री के बिना स्थानांतरित करना, पहले से ही उपलब्ध है, इसे कहा जाता है mkdir


2
यह सही है, मैं बस के बारे में सोच रहा था cpऔर mvसंचालन के रूप में उन्हें नाम दिया गया था: 'एक प्रतिलिपि बनाएँ' और 'चाल'। इसलिए अगर मैं एक कप कॉफी की एक प्रति बनाना चाहता हूं, तो मुझे उसी फिलिंग (कॉफी पीने) के साथ एक और कप कॉफी की उम्मीद होगी। समस्या यह है कि उपकरण 'सामान्य लोगों' के लिए नहीं हैं, लेकिन उन nerds के लिए हैं जो डिस्क और फ़ाइल सिस्टम संरचना के बारे में जानते हैं, न कि आभासी संस्थाएँ जैसे फाइलें और फाइलों की डायरियाँ।
rslnx

1
अच्छी तरह से संरचित, तर्कपूर्ण प्रतिक्रिया।
स्‍पलेज करें

1
@RuslanKhusnullin आपकी कॉफ़ी सादृश्यता cpऔर इसके लिए mvभी काम करती है - इसे समझने के लिए किसी भी स्तर की आवश्यकता नहीं है, बस बुनियादी सामान्य ज्ञान। एक कप कॉफी की एक सच्ची प्रतिलिपि एक खाली कप नहीं है - आपको न केवल कप, बल्कि इसकी सभी सामग्री (कॉफी) की भी पुनरावृत्ति करनी होगी। हालाँकि, जब आप एक कप कॉफी ले जाते हैं तो आपको सामग्री को अलग से स्थानांतरित करने की आवश्यकता नहीं होती है - सामग्री कंटेनर के साथ स्वाभाविक रूप से चलती है।
jw013

1
@ jw013 आपने मुझे तब प्रभावित किया जब "जब आप एक कप कॉफी ले जाते हैं तो आपको अलग से सामग्री को स्थानांतरित नहीं करना पड़ता है", यह वास्तव में समझ में आता है, धन्यवाद। लेकिन यह अमूर्तता की एक और परत है। मुझे लगता है कि आप का मतलब है "एक फ़ाइल को एक इनोड के रूप में समझो" जबकि मैं मेटा-जानकारी के बिना बाइट्स अनुक्रम की तरह फ़ाइलों के बारे में सोचता हूं।
rslnx

6

आमतौर पर जब मैं यूनिक्स तर्क से खिलवाड़ करता हूं तो मैं प्लान 9 को देखता हूं कि कैसे यूनिक्स के आविष्कारकों ने उसी कार्य को वर्षों बाद बिना पिछड़े अनुकूलता के लागू किया।

तो Plan9 ऑफर cpऔर mvटूल केवल फाइलों के साथ संचालित करने के लिए।

`cp f1 f2` creates f2 and copies f1's contents into it.
`mv f1 f2` renames f1 to f2 if f1 and f2 are in the same dir
           does `cp f1 f2 && rm f1` else
           can rename dirs (`mv d1 d2`) but will not move dir to another dir.

एक dir की प्रतिलिपि बनाने के लिए dircpजो वास्तव में है @{cd fromdir && tar c .} | @{cd todir && tar xT}(rc शेल सिंटैक्स)

एक हलचल के लिए मुझे लगता है कि केवल वहीं है dircp d1 d2 && rm -r d1

मुझे लगता है कि इस निर्णय को सीमित करने के लिए cpऔर mvकेवल फ़ाइल संचालन के लिए (डिस्क नहीं) डिस्क संचालन के लिए अधिक स्पष्टता लाता है और tarफ़ाइल पेड़ों की नकल के लिए उपयोग करना समझ और स्क्रिप्टिंग के लिए बहुत आरामदायक है।

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