शेल से लिनक्स में एक फ़ाइल को दूसरे में कैसे जोड़ा जाए?


418

मेरे पास दो फाइलें हैं: file1और file2। मैं कैसे की सामग्री को संलग्न करते file2करने के लिए file1इसलिए की सामग्री है कि file1प्रक्रिया जारी रहती है?

जवाबों:


610

2
आप इसे कैसे करते हैं गंतव्य फ़ाइल आपके पास नहीं है और आपको sudo का उपयोग करने की आवश्यकता है?
बिजय रूंगटा

1
@BijayRungta: ऐसा लगता है कि आपने अपने प्रश्न का उत्तर दिया। आप कमांड sudoको प्री-पेंड करेंगे cat(और संकेत दिए जाने पर क्रेडेंशियल दर्ज करें)।
डेविड

आपको जरूरत है ... खुद को उस फ़ाइल पर लिखने की अनुमति देने के लिए 777 / etc / default /
docker में chmod

1
@Sigur: जब तक आउटपुट को एक साथ दो फाइलों में निर्देशित करने का कोई तरीका नहीं है, तब तक इसमें कमांड के दो इनवॉइस शामिल होंगे।
डेविड

2
@Sigur या पर एक नजर है teeकार्यक्रम: cat 1 | tee -a 2 3। आप --append(या -aसंक्षेप में) स्विच के बाद जितनी चाहें उतनी फाइलें डाल सकते हैं ।
स्टीफन वैन डेन अककर

291

cat file2 >> file1

>>ऑपरेटर नाम की फ़ाइल को आउटपुट संलग्न कर देता है या नामित फ़ाइल बनाता है अगर यह मौजूद नहीं है।

cat file1 file2 > file3

यह एक के लिए दो या अधिक फ़ाइलों को समाप्‍त करता है। आपके पास जितनी जरूरत हो उतनी स्रोत फाइलें हो सकती हैं। उदाहरण के लिए,

cat *.txt >> newfile.txt

अपडेट 20130902
टिप्पणी में यूमिरो सुझाव देता है "कोशिश मत करो cat file1 file2 > file1।" इसका परिणाम अपेक्षित परिणाम नहीं हो सकता है, क्योंकि पुनर्निर्देशन प्राप्त करने वाली फ़ाइल >को निष्पादित होने से पहले कमांड को बाईं ओर तैयार किया जाता है। इस मामले में, पहले file1शून्य लम्बाई तक छोटा कर दिया और, तो उत्पादन के लिए खोला जाता है catअब शून्य लंबाई फ़ाइल प्लस की सामग्री को श्रेणीबद्ध करने के आदेश के प्रयास file2में file1। इसका परिणाम यह होता है कि मूल सामग्री file1खो जाती है और उसके स्थान पर इसकी एक प्रति होती है, file2जिसकी शायद वह उम्मीद नहीं थी।

अपडेट 20160919
टिप्पणियों में टेंपररी बैकिंग सूचना / स्रोतों को जोड़ने का सुझाव देती है। एक आधिकारिक संदर्भ के लिए, मैं linuxcommand.org पर sh man पेज पर किस तरह के पाठक को निर्देशित करता हूं :

एक कमांड निष्पादित होने से पहले, इसके इनपुट और आउटपुट को शेल द्वारा व्याख्या किए गए विशेष नोटेशन का उपयोग करके पुनर्निर्देशित किया जा सकता है।

हालांकि इससे पाठक को पता चलता है कि उन्हें क्या जानना है, यह याद रखना आसान है यदि आप इसे नहीं ढूंढ रहे हैं और शब्द द्वारा कथन शब्द को पार्स कर रहे हैं। यहां सबसे महत्वपूर्ण शब्द 'पहले ’है। आदेश निष्पादित होने से पहले पुनर्निर्देशन पूरा हो गया है (या विफल) ।

उदाहरण के मामले में cat file1 file2 > file1शेल पहले पुनर्निर्देशन करता है ताकि I / O हैंडल वातावरण में जगह में हो जिसमें कमांड निष्पादित होने से पहले निष्पादित हो जाएगा।

एक फ्रेंडली संस्करण जिसमें रीडायरेक्शन पूर्ववर्तीता लंबाई में कवर की गई है, को इयान एलन की वेब साइट पर लिनक्स कोर्सवेयर के रूप में पाया जा सकता है। उनके I / O पुनर्निर्देशन नोट्स पृष्ठ में विषय पर कहने के लिए बहुत कुछ है, जिसमें यह अवलोकन भी शामिल है कि पुनर्निर्देशन एक कमांड के बिना भी काम करता है। इस गोले को पास करना:

$ >out

... एक खाली फ़ाइल बनाता है जिसका नाम है। शेल पहले I / O पुनर्निर्देशन सेट करता है, फिर एक कमांड की तलाश करता है, कोई नहीं ढूंढता है, और ऑपरेशन पूरा करता है।


17
@ आमिर - कोशिश मत करो cat file1 file2 > file1- यह काम नहीं करेगा जैसे आप शायद इंतजार कर रहे हैं।
यूमरियो

5
वास्तव में यह वही है जो उसे चाहिए। वह कहते हैं, "मौजूदा फ़ाइल 1 को अधिलेखित किए बिना।" पहले तीन उत्तरदाताओं ने प्रश्न के इस भाग को पूरी तरह से अनदेखा कर दिया है और एक कमांड का उपयोग करने का सुझाव दिया है >>जो फ़ाइल को संशोधित करेगाfile1 । T.ob ने अपने जवाब को स्पष्ट करने के बजाय केवल तथ्य प्रस्तुत करने के लिए दौड़ने का एक बेहतर काम किया, जो कि वास्तव में गलत था। प्रश्न के पाठ के आधार पर, मेरा मानना ​​है कि cat file1 file2 > file3यह उचित आदेश है जो @ नासिर की तलाश में था।
dm78

दयालु शब्दों के लिए धन्यवाद, डेविड! @Eumiro ऊपर इंगित करता है, लेकिन इस पर विस्तार से नहीं जाता है कि >पहले के दाईं ओर ऑपरेशन को निष्पादित किया जाता है। इसलिए क्रियान्वित करने वाला cat file1 file2 > file1पहले क्लोबर होगा, file1फिर स्वयं पर अब-शून्य-लंबाई फ़ाइल को कॉपी करने का प्रयास करेगा । यह तब समझ में आता है जब आप उस क्रम के बारे में सोचते हैं जिसमें परिचालन हो सकता है और होना चाहिए लेकिन इतना सूक्ष्म है कि यह कई लोगों को आश्चर्यचकित कर देता है। तो अगर और कुछ नहीं, यूमिरो और आपने उत्तर में एक और सुधार के लिए प्रेरित किया है। उसके लिए धन्यवाद!
टी। आरओबी

इसके अलावा cat file1 >> file1 को आज़माएँ, इससे फ़ाइल को फिर से लिखा जा सकेगा, मैं गलती से ऐसा कर रहा हूँ और बस कुछ ही सेकंडों में, 50 मिलियन लाइनों को फ़ाइल में डाल दिया गया है बस कुछ दर्जन लाइनों से।
हेंद्रा उज़िया

इसके अलावा, इसे थोड़ा और संक्षिप्त बनाने के लिए, यदि "नई फ़ाइल" पहले से मौजूद है, तो फ़ाइल में >> संलग्न हो जाती है और फ़ाइल को > बदल देती है।
रिनोगो

43

नोट : यदि आपको sudo का उपयोग करने की आवश्यकता है , तो यह करें:

sudo bash -c 'cat file2 >> file1'

केवल sudoकमांड के आगे बढ़ने की सामान्य विधि विफल हो जाएगी, क्योंकि विशेषाधिकार वृद्धि आउटपुट पुनर्निर्देशन में नहीं ले जाती है।


6
इसके लिए एक और आम मुहावरा हैcat file2 | sudo tee -a file1 > /dev/null
www


13

केवल संदर्भ के लिए, ddresoscope का उपयोग करना कार्य को प्राप्त करने का एक आसान तरीका प्रदान करता है यदि, उदाहरण के लिए, आपके पास बड़ी फाइलें हैं और बाद में कुछ बिंदुओं पर रुकने की आवश्यकता है:

ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile

logfileमहत्वपूर्ण बिट है। आप प्रक्रिया को बाधित कर सकते हैं Ctrl-Cऔर इसे फिर से उसी कमांड को निर्दिष्ट करके logfileफिर से शुरू कर सकते हैं और ddrescue पढ़ेगा और फिर से शुरू करेगा जहाँ से इसे छोड़ा था। -o Aझंडा ddrescue बताता बाइट से शुरू करने के लिए एक आउटपुट फ़ाइल में ( file1)। तो wc --bytes file1 | awk '{ print $1 }'बस file1बाइट्स का आकार निकालता है (आप केवल आउटपुट में पेस्ट कर सकते हैंls यदि आप चाहें तो हैं)।

जैसा कि टिप्पणियों में ngks द्वारा बताया गया है , नकारात्मक पक्ष यह है कि ddresoscope संभवतः डिफ़ॉल्ट रूप से स्थापित नहीं किया जाएगा, इसलिए आपको इसे मैन्युअल रूप से इंस्टॉल करना होगा। दूसरी जटिलता यह है कि ddrescue के दो संस्करण हैं जो आपके रिपॉजिटरी में हो सकते हैं: अधिक जानकारी के लिए इस अक्कुबंटु प्रश्न को देखें । आप जो संस्करण चाहते हैं वह GNU ddrescue है, और डेबियन-आधारित सिस्टम पर नामित पैकेज है gddrescue:

sudo apt install gddrescue

अन्य distros के लिए ddrescue के GNU संस्करण के लिए अपने पैकेज प्रबंधन प्रणाली की जाँच करें ।


1
नए उपयोगकर्ताओं के लाभ के लिए: ddrescue एक GNU उपकरण है, लेकिन यह आपके लिनक्स, मैक या अन्य यूनिक्स जैसी प्रणाली पर मौजूद नहीं हो सकता है। ddrescue POSIX या किसी अन्य मानक द्वारा अपेक्षित नहीं दिखाई देता है।

2

एक और समाधान:

cat file1 | tee -a file2

tee उदाहरण के लिए, आप जितनी चाहें उतनी फ़ाइलों के लिए आवेदन कर सकते हैं।

cat file1 | tee -a file2 file3 file3

की सामग्री को संलग्न कर देगा file1करने के लिए file2, file3और file4

आदमी पृष्ठ से:

-a, --append
       append to the given FILEs, do not overwrite

0

catआसान समाधान हो सकता है, लेकिन जब हम बड़ी फ़ाइलों को बदलते हैं तो यह बहुत धीमी हो जाती है, find -printआपको बचाने के लिए, हालांकि आपको एक बार बिल्ली का उपयोग करना होगा।

amey@xps ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt

 amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt

real    0m3.084s
user    0m0.012s
sys     0m2.308s


amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1

real    0m2.516s
user    0m0.028s
sys     0m2.204s

आपके खोज / बिल्ली कॉम्बो कमांड के लिए आपके द्वारा रिपोर्ट की गई समय बचत इसलिए है क्योंकि आप केवल खोज कमांड का समय निर्धारित कर रहे हैं जो फाइलों के नाम को प्रिंट कर रहा है। इस तरह से पूरे कमांड को टाइमिंग करने की कोशिश करें: time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)और यह आपकी बिल्ली के लिए केवल कमांड के समान परिणाम देगा।
जोशमै

0

आप इसके बिना भी कर सकते हैं cat, हालांकि ईमानदारी catसे अधिक पठनीय है:

>> file1 < file2

>>संलग्न कर देता है STDIN करने file1और <उदासीनता file2के लिए STDIN



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