cp जब अजीब व्यवहार करता है। (डॉट) या .. (डॉट डॉट) सोर्स डायरेक्टरी हैं


15

इस उत्तर से पता चलता है कि कोई भी सभी फ़ाइलों को कॉपी कर सकता है - जिनमें छिपा हुआ है - निर्देशिका से निर्देशिका srcमें destजैसे:

mkdir dest
cp -r src/. dest

उत्तर या इसकी टिप्पणियों में कोई स्पष्टीकरण नहीं है कि यह वास्तव में क्यों काम करता है, और किसी को भी इस पर दस्तावेज़ीकरण नहीं लगता है।

मैंने कुछ चीजों की कोशिश की। सबसे पहले, सामान्य मामला:

$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file  src

फिर, /.अंत में:

$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file  .dotfile  src_dir  src_file

तो, यह बहुत बढ़ा-चढ़ाकर व्यवहार करता है *, लेकिन छिपी हुई फाइलों की नकल भी करता है।

$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest
$ ls -A dest
dest_file  src_dir  src_file

.और ..उचित हार्ड-लिंक हैं जैसा कि यहां बताया गया है , जैसे कि निर्देशिका प्रविष्टि ही।

यह व्यवहार कहां से आया है, और यह कहां से प्रलेखित है?


3
आप क्या मतलब है कि कोई भी दस्तावेज नहीं मिल सकता है? cpसंदर्भ स्पष्ट रूप से बताते हैं कि कैसे cp -Rकाम करता है। .और ..किसी भी अन्य निर्देशिकाओं की तरह ही निर्देशिकाएं हैं, उनके बारे में जादुई या रहस्यमय कुछ भी नहीं है।
एलेक्सपी

2
@AlexP मैंने इसे स्पष्ट करने के लिए उत्तर संपादित किया। पूरे मुद्दा यह है कि है .और ..अन्य निर्देशिकाओं की तरह व्यवहार नहीं करते।
१५:१५ पर :07फ्रिलिच्ट

मैं समझाने की कोशिश की है कि ऐसा क्यों में काम करता है कैसे एक idempotent तरह से रिकर्सिवली एक फ़ोल्डर की प्रतिलिपि करने सीपी का उपयोग कर
roaima

जवाबों:


27

व्यवहार के लिए प्रलेखित एल्गोरिथ्म का एक तार्किक परिणाम है cp -RPOSIX देखें , चरण 2f:

डायरेक्टरी source_file की फाइलों को डायरेक्टरी dest_file पर कॉपी किया जाएगा , यहां फाइलों के साथ source_files के रूप में सूचीबद्ध चार चरण (1 से 4) ले रहे हैं ।

.और ..निर्देशिका, क्रमशः वर्तमान निर्देशिका और मूल निर्देशिका हैं। जहां तक ​​शेल का संबंध है, न तो विशेष हैं, इसलिए न तो विस्तार से चिंतित हैं, और निर्देशिका को छिपी हुई फ़ाइलों सहित कॉपी किया जाएगा। *दूसरी ओर, फ़ाइलों की एक सूची के लिए विस्तारित किया जाएगा, और यह वह जगह है जहाँ छिपी हुई फ़ाइलों को फ़िल्टर किया जाता है।

src/.वर्तमान निर्देशिका अंदर है src, जो srcस्वयं है; src/src_dir/..है src_dirकी मूल निर्देशिका है, जो फिर से है src। तो बाहर से src, यदि srcकोई निर्देशिका है, तो निर्दिष्ट करने src/.या src/src_dir/..स्रोत फ़ाइल के रूप cpमें समतुल्य है, और srcछिपी हुई फ़ाइलों सहित सामग्री की प्रतिलिपि बनाएँ ।

यह निर्दिष्ट करने src/.की बात यह है कि यदि srcनिर्देशिका (या किसी निर्देशिका का प्रतीकात्मक लिंक) नहीं है तो यह विफल हो जाएगा , जबकि srcऐसा नहीं होगा। यह भी srcकेवल नकल के बिना, केवल सामग्री की नकल करेगा src; यह प्रलेखन से भी मेल खाता है:

यदि लक्ष्य मौजूद है और नाम के लिए एक मौजूदा निर्देशिका, फ़ाइल पदानुक्रम में प्रत्येक फ़ाइल के लिए इसी गंतव्य पथ के नाम का संयोजन किया जाएगा लक्ष्य , एक एकल स्लेश चरित्र यदि लक्ष्य एक स्लेश में खत्म नहीं हुई, और फ़ाइल रिश्तेदार के पथ नाम source_file युक्त निर्देशिका के लिए ।

तो cp -R src/. destप्रतियां की सामग्री srcके लिए dest/.(स्रोत फ़ाइल है .में src), जबकि cp -R src destप्रतियां की सामग्री srcके लिए dest/src(स्रोत फ़ाइल है src)।

इसके बारे में सोचने का एक और तरीका है नकल करना src/src_dirऔर तुलना करने के src/.बजाय src/.और src। पूर्व के मामले की .तरह ही व्यवहार करता है src_dir


लेकिन यह उसी तरह व्यवहार नहीं करता है। निर्दिष्ट srcमें निर्देशिका में कॉपी कर देंगे dest, src/.सामग्री की प्रतिलिपि होगा। मैं उस प्रश्न में स्पष्ट करने की कोशिश करूंगा।
iFreilicht

वहाँ, मुझे लगता है कि आपके अंतर्निहित प्रश्न का उत्तर देता है।
स्टीफन किट

1
@ स्टीफन ओपी नकल की तुलना करता है src/.और src/*(नोट, नहीं src/.* ); src/*छिपी हुई फ़ाइलों को शामिल नहीं करता है अगर ग्लोबिंग उन्हें अनदेखा करता है ...
स्टीफन किट

1
हम्म, "डायरेक्ट्री युक्त source_file "। ठीक है, स्पष्ट रूप से srcशामिल है, src/.लेकिन इसका मतलब यह है कि किसी निर्देशिका की निर्देशिका इस बात पर निर्भर करती है कि आप निर्देशिका का नाम कैसे देते हैं। बेशक .एक तरह से लिंक के अस्तित्व का मतलब है कि सभी निर्देशिकाओं में स्वयं शामिल हैं, लेकिन यह सभी के लिए सहज नहीं हो सकता है। इस व्यवहार के बजाय, किसी को यह मानने के लिए भी लुभाया जा सकता है कि "निर्देशिका युक्त निर्देशिका foo" द्वारा निर्धारित किया जाएगा foo/.., जिस स्थिति में यह बात नहीं होगी यदि हम इसका संदर्भ देते हैं : fooया foo/.जिसके परिणामस्वरूप निर्देशिका समान होगी।
ilkachachu

1
जो कहना है कि बीच का अंतर fooऔर foo/.थोड़ा नाजुक लगता है, लेकिन मुझे कोई आपत्ति नहीं है, मुझे यह थोड़ा मनोरंजक भी लगता है।
ilkachachu

1

जब आप दौड़ेंगे cp -R src/foo destतो आपको मिलेगा dest/foo। तो अगर निर्देशिका dest/fooमौजूद नहीं है, cpयह पैदा करेगा, और उसके बाद की सामग्री की प्रतिलिपि src/fooकरने के लिए dest/foo

जब आप दौड़ते हैं cp -R src/. dest, तो cpदेखता है कि dest/.मौजूद है, और फिर यह केवल सामग्री की नकल करने की बात src/.है dest/.

जब आप नाम के एक निर्देशिका को कॉपी के रूप में यह के बारे में सोच .से srcऔर मौजूदा निर्देशिका के साथ इसकी सामग्री विलय dest/., यह मतलब होगा।

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