cp बनाम कैट एक फाइल कॉपी करने के लिए


12

cp a bऔर cat a > b, क्या अंतर है?

X86 में लिनक्स कर्नेल के स्रोत वृक्ष की स्क्रिप्ट स्थापित करें ( arch/x86/boot/install.sh), दोनों का उपयोग किया जाता है:

cat $2 > $4/vmlinuz
cp $3 $4/System.map

यदि वे दूसरे से बेहतर हैं तो वे केवल एक ही प्रारूप क्यों नहीं रखते हैं?

जवाबों:


15

एक और मुद्दा मेरे दिमाग में आता है जहाँ catबनाम cpएक महत्वपूर्ण अंतर होता है:

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

विरल फाइलें वे फाइलें हैं जहां अंतरिक्ष को संरक्षित करने के लिए मेटाडेटा द्वारा शून्य बाइट्स के दृश्यों को बदल दिया गया है। आप dd के साथ एक बनाकर परीक्षण कर सकते हैं, और अपनी पसंद के टूल के साथ इसे डुप्लिकेट कर सकते हैं।

  1. एक विरल फ़ाइल बनाएँ (मुसीबत से बचने के लिए / tmp को पहले से बदलकर - अंतिम नोट देखें):

    15> cd /tmp
    16> dd if=/dev/null of=sparsetest bs=512b seek=5 
    0+0 records in 
    0+0 records out 
    0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/s
    
  2. इसे आकार दें - इसे कोई स्थान नहीं लेना चाहिए।

    17> du -sh sparsetest
    0       sparsetest
    
  3. इसे cp और चेक साइज़ के साथ कॉपी करें

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
    
  4. अब इसे कैट और चेक साइज़ के साथ कॉपी करें

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
    
  5. अपने व्यवहार पर जाँच करने के लिए अपने पसंदीदा उपकरण आज़माएँ

  6. साफ करना मत भूलना।

सावधानी के अंतिम नोट: अगर आपके बैकअप सिस्टम में उनकी फाइल योजना का हिस्सा है, या सिस्टम की भलाई के लिए महत्वपूर्ण है, तो इस तरह के प्रयोग आपके स्थानीय sysadmin के साथ अपनी प्रसिद्धि को बढ़ाने का अंतर्निहित मौका है। बैकअप के लिए उपकरण की अपनी पसंद के आधार पर, वह कभी भी अधिक टेप मीडिया की आवश्यकता को समाप्त कर सकता है, क्योंकि उसने कभी भी उस 0-बाइट फ़ाइल का बैकअप लेना संभव नहीं समझा, जो कि जीरो के टेराबाइट्स तक विस्तारित हो जाती है।

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


1
इसलिए cpमूल की तरह ही एक फ़ाइल catबनाता है , जबकि एक ही सामग्री के साथ एक नई फ़ाइल बनाता है।
कियान

दोनों उपकरण सामग्री पर काम करते हैं, लेकिन cp (कम से कम "आधुनिक" कार्यान्वयन) आजकल कुछ विशिष्टताओं से अवगत हैं, जैसे छेद (बिल्ली का पुराना कार्यान्वयन उस जाल में चलेगा)। ऐसे फाइलसिस्टम भी हैं जो विरल फ़ाइलों की अवधारणा से अनजान हैं, उदाहरण के लिए HFS + (MacOS) या FAT (MSDOS, USB-Sticks, आदि), जिससे उन्हें अपने पूर्ण आकार तक उड़ा दिया जाता है। इसलिए नक्षत्र हैं जहाँ cp या cat अभ्यास में अंतर नहीं करेगी।
तातजाना हेसर

Btw, GNU cpविरल फाइलों पर अपने व्यवहार को नियंत्रित करने के लिए एक विकल्प है; जैसे, --sparse=neverकमांड लाइन पर निर्दिष्ट, cpके रूप में के रूप में धीमी है cat
ओगुज़ ने

6

कीथ की टिप्पणी के अनुसार , cpकुछ अनुमतियों को संरक्षित catकरता है , और umaskसंकेत के रूप में नई फ़ाइल बनाता है। तो $2यह अनुमति सुरक्षित नहीं है जो $4/vmlinuzबहुत साफ है, जबकि अगर कुछ अजीब अनुमति निर्धारित है $3, तो $4/System.mapवह रखेगा।


यह कारण है कि catव्रत की विशेषता है ?
निखिल मुल्ले

2
है catतेजी से?
कियान

4

उन दोनों मामलों में दोनों की समान कार्यक्षमता है, लेकिन cp शुद्ध रूप से एक फ़ाइल ऑपरेशन है। "इस फाइल को ले लो और वहाँ पर इसकी एक प्रति बनाओ"।

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

cp आम तौर पर अधिक कुशल होगा, क्योंकि केवल पुनर्निर्देशन नहीं हो रहा है, केवल स्थान A से स्थान B तक बाइट्स की एक सीधी नकल है।

बिल्ली होगी read bytes -> output to console -> intercept output -> redirect to new file


3
catवास्तव में output to console -> intercept output -> redirect to new file, बिल्ली के लिए आउटपुट फ़ाइल stdout या एक सामान्य फ़ाइल हो सकती है, यह फ़ाइल के लिए सिर्फ आउटपुट देगा, जब तक कि इनपुट आउटपुट के समान नहीं होता।

4
catकंसोल से कोई लेना-देना नहीं है। दोनों catऔर cpइनपुट फ़ाइल और आउटपुट फाइल करने के लिए लिखने से पढ़ें। साथ cat, आउटपुट फ़ाइल खोल द्वारा खोला जाता है, के साथ जबकि cp, आउटपुट फ़ाइल द्वारा खोला जाता है cp; इससे प्रदर्शन में कोई फर्क नहीं पड़ता। cpतेजी से हो सकता है, लेकिन एक पूरी तरह से अलग कारण के लिए: cpस्रोत और लक्ष्य उपकरणों के आधार पर प्रदर्शन के लिए सही चंक आकार का अनुमान लगाने की कोशिश के कुछ कार्यान्वयन ; के कार्यान्वयन को catपरेशान नहीं करेगा।
गिल्स एसओ- बुराई को रोकना '

2

यह वास्तव में प्राथमिकता का विषय है, IMHO।

जब तक आप फ़ाइल स्वामित्व / समूह को संरक्षित करने के लिए -p स्विच के साथ cp कमांड का उपयोग नहीं करते हैं तब तक कोई वास्तविक अंतर नहीं है। अन्यथा, यह कार्यात्मक रूप से एक ही बात है। मार्क का उत्तर बहुत अधिक स्पष्ट रूप से स्पष्ट और सटीक है।


3
cpबिना कुछ अनुमतियों -pको संरक्षित करता है । उदाहरण के लिए, यदि स्रोत फ़ाइल निष्पादन योग्य है, तो लक्ष्य फ़ाइल को निष्पादन योग्य बना देगा, लेकिन ऐसा नहीं होगा। cpcat
कीथ थॉम्पसन

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