फाइल करने के लिए लिखें, लेकिन मौजूद होने पर उसे अधिलेखित कर दें


252
echo "text" >> 'Users/Name/Desktop/TheAccount.txt'

मैं इसे कैसे बनाऊं इसलिए यह फ़ाइल बनाता है यदि यह मौजूद नहीं है, लेकिन इसे पहले से मौजूद होने पर इसे अधिलेखित कर देता है। अभी यह लिपि सिर्फ जोड़ देती है।


अच्छा..ये कमाल है। मैंने स्वीकार किया>> की तुलना में थोड़ा पहले >>।
जोकेस्टर

जवाबों:


411

* निक्स पाइप कैसे काम करते हैं इसकी थोड़ी समझ मदद करेगी।

संक्षेप में >>पुनर्निर्देशन ऑपरेटर निर्दिष्ट फ़ाइल के अंत में लाइनों को जोड़ देगा, जहां-जैसे एकल से अधिक >खाली हो जाएगा और फ़ाइल को अधिलेखित कर देगा।

echo "text" > 'Users/Name/Desktop/TheAccount.txt'

9
कुछ वातावरण कुछ के साथ पसंद नहीं है -bash: TheAccount.txt: cannot overwrite existing file
टॉम रसेल

16
इसके अलावा, >और >>कर रहे हैं उत्पादन पुनर्निर्देशन ऑपरेटरों। पाइप ऑपरेटर है |
टॉम रसेल

22
@BrDaHa द्वारा उत्तर देखें। >|मौजूदा अधिलेखित करने के लिए उपयोग करें
जेक

2
यह बिल्कुल सही उत्तर नहीं है क्योंकि यह मौजूदा फाइल को नहीं
लिखेगा

4
उत्तर को इन टिप्पणियों से @ जेक के उत्तर के साथ अद्यतन किया जाना चाहिए, स्वीकृत उत्तर कई मायनों में गलत है
rm.rf.etc 19

90

बैश में, यदि आपने noclobber a la सेट किया है set -o noclobber, तो आप सिंटैक्स का उपयोग करते हैं>|

उदाहरण के लिए:

echo "some text" >| existing_file

यदि फ़ाइल अभी तक मौजूद नहीं है तो भी यह काम करता है


  • जाँच करें कि क्या noclobber के साथ सेट किया गया है: set -o | grep noclobber

  • इस विशेष प्रकार के ऑपरेटर पर अधिक विस्तृत विवरण के लिए, इस पोस्ट को देखें

  • पुनर्निर्देशन ऑपरेटरों की अधिक विस्तृत सूची के लिए, इस पोस्ट को देखें


@stimulate क्या आप बैश शेल का उपयोग कर रहे हैं?
BrDaHa

@BrDaHa मैं कैसे> के साथ stderr पुनर्निर्देशित कर सकता हूं भी? मैंने कोशिश की &> | लेकिन यह काम नहीं किया।
तू बुई

@TuBui सुनिश्चित नहीं हैं कि यह आपके लिए काम क्यों नहीं कर रहा है। मेरी मशीन पर &>| fileकाम करता है। आप किस शेल और वर्जन का उपयोग कर रहे हैं? @ जैश के लिए दोनों को काम करना चाहिए , केवल>|
ग्रिडो

@ गरिदो मेरा खोल bash संस्करण 4.3.48 (1) -release है। echo "aaa" &>| test.txtपरिणाम में त्रुटि -bash: syntax error near unexpected token |। मेरा noclobber चालू है।
तू बुई

1
@TuBui जाहिर है मैं सही ढंग से परीक्षण नहीं कर रहा था। यह मेरे लिए भी काम नहीं कर रहा है ... हालांकि प्रलेखन यह नहीं बताता है कि यह किसी भी तरह से संभव होना चाहिए। आपको शायद echo "aaa" >| test.txt 2>&1किसी अन्य शेल से चिपकना या उपयोग करना होगा।
गिडो

40

के NylonSmileउत्तर के बावजूद , जो "सही" है .. मैं इस तरह से, फ़ाइलों को अधिलेखित करने में असमर्थ था ।

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

अपने मुद्दों को हल करने के लिए .. मुझे उपयोग करना था ... >!, á la ..

[[ $FORCE_IT == 'YES' ]] && echo "$@" >! "$X" || echo "$@" > "$X"

जाहिर है, इससे सावधान ...


26
इसका मतलब है कि आपके पास नॉन-डिफॉल्ट zsh विकल्प NOCLOBBERसेट है। setopt clobber डिफ़ॉल्ट व्यवहार को पुनर्स्थापित करने के लिए उपयोग करें ।
माइकल पोलित्स्की

11

यदि आपका वातावरण इसके साथ ओवरराइटिंग की अनुमति नहीं देता है >, तो पाइप का उपयोग करें |और teeइसके बजाय निम्न प्रकार से करें:

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt'

ध्यान दें कि यह प्रिंटआउट भी प्रिंट करेगा। यदि यह अवांछित है, तो आप आउटपुट को /dev/nullनिम्न प्रकार से रीडायरेक्ट कर सकते हैं:

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt' > /dev/null


2

सिर्फ यह देखते हुए कि यदि आप दोनों std :: cerr और std :: cout को किसी फ़ाइल में पुनर्निर्देशित करना चाहते हैं, जबकि आपके पास noclobber सेट (यानी set -o noclobber) है, तो आप कोड का उपयोग कर सकते हैं:

    cmd >|file.txt 2>&1

इसके बारे में अधिक जानकारी https://stackoverflow.com/a/876242 पर देखी जा सकती है ।

इसके अलावा इस सवाल का जवाब @ प्रदान की जवाब @BrDaHa पर TuBui के सवाल है ऊपर 09:34 पर अगस्त 9 '18 में।


0

एक फ़ाइल की सामग्री को किसी अन्य फ़ाइल में अधिलेखित करने के लिए। बिल्ली जैसे का उपयोग करें।

echo  "this is foo" > foobar.txt
cat foobar.txt

echo "this is bar" > bar.txt
cat bar.txt

अब फोब्बर को अधिलेखित करने के लिए हम नीचे एक बिल्ली कमांड का उपयोग कर सकते हैं

cat bar.txt >> foobar.txt
cat foobar.txt

यहां छवि विवरण दर्ज करें


"अब >>
फोब्बर

-2

यदि आपके पास आउटपुट है जिसमें त्रुटियां हो सकती हैं, तो आप निम्नानुसार एक एम्परसेंड और एक से अधिक का उपयोग करना चाह सकते हैं :

my_task &> 'Users/Name/Desktop/task_output.log' यह stderr और stdout दोनों को लॉग फ़ाइल में रीडायरेक्ट करेगा (केवल stdout के बजाय)।


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