एक फ़ाइल को प्रस्तुत करने के लिए एक लाइनर शेल


131

यह शायद एक जटिल समाधान है

मैं ">>" जैसे एक साधारण ऑपरेटर की तलाश कर रहा हूं, लेकिन पहले से तैयार होने के लिए।

मुझे डर है कि यह मौजूद नहीं है। मुझे कुछ ऐसा करना होगा

 एमवी मायफाइल टीएमपी
 cat myheader tmp> myfile

कुछ होशियार?


इसमें गलत क्या है mktemp? आप हमेशा अस्थायी फ़ाइल को बाद में साफ कर सकते हैं ...
कैंडु

जवाबों:


29

हैक नीचे एक त्वरित ऑफ-द-कफ जवाब जो काम किया है और प्राप्त upvotes के बहुत सारे थे। फिर, जैसा कि यह सवाल अधिक लोकप्रिय हो गया और अधिक समय बीत गया, नाराज लोगों ने यह रिपोर्ट करना शुरू कर दिया कि यह काम करता है लेकिन अजीब चीजें हो सकती हैं, या यह सिर्फ काम नहीं करता है, इसलिए इसे एक समय के लिए खराब कर दिया गया था। ऐसा मज़ा।

समाधान आपके सिस्टम पर फ़ाइल डिस्क्रिप्टर के सटीक कार्यान्वयन का शोषण करता है और, क्योंकि कार्यान्वयन निक्स के बीच महत्वपूर्ण रूप से भिन्न होता है, यह सफलता पूरी तरह से सिस्टम पर निर्भर है, निश्चित रूप से गैर-पोर्टेबल है, और किसी भी चीज़ के लिए भी निर्भर नहीं होना चाहिए।

अब, उस उत्तर के सभी के साथ:


फ़ाइल के लिए एक और फाइल डिस्क्रिप्टर बनाना ( exec 3<> yourfile) थेंस राइटिंग टू ( >&3) एक ही फाइल दुविधा पर पढ़ने / लिखने पर काबू पाने के लिए लगता है। 600k फ़ाइलों पर मेरे लिए awk के साथ काम करता है। हालाँकि 'कैट' का उपयोग करके एक ही चाल की कोशिश करना विफल हो जाता है।

प्रीपेन्डेज को एक चर के रूप में जागृत करना ( -v TEXT="$text") शाब्दिक उद्धरण समस्या को खत्म करता है जो इस ट्रिक को 'सेड' करने से रोकता है।

#!/bin/bash
text="Hello world
What's up?"

exec 3<> yourfile && awk -v TEXT="$text" 'BEGIN {print TEXT}{print}' yourfile >&3

3
चेतावनी: यह सुनिश्चित करने के लिए आउटपुट की जाँच करें कि कुछ भी नहीं बदला है लेकिन पहली पंक्ति। मैंने इस समाधान का उपयोग किया, और यद्यपि यह काम करने लगा, मैंने देखा कि कुछ नई लाइनें जोड़ी गईं। मुझे समझ नहीं आ रहा है कि ये कहां से आए हैं, इसलिए मुझे यकीन नहीं हो रहा है कि इस समाधान में वास्तव में समस्या है, लेकिन सावधान रहें।
कॉनरेडली

1
ऊपर दिए गए बैश उदाहरण में ध्यान दें कि दोहरे उद्धरण चिह्नों में कई लाइनों को प्रदर्शित करने के लिए गाड़ी वापस आ जाती है। अपने शेल की जाँच करें और पाठ संपादक सहकारी हो रहे हैं। \ r \ n के दिमाग में आता है।
जॉन मी

4
सावधानी के साथ यह प्रयोग करें! निम्न टिप्पणियों को देखें कि क्यों: stackoverflow.com/questions/54365/…
एलेक्स

3
यदि यह अब अविश्वसनीय है, तो बेहतर समाधान के साथ अपने उत्तर को कैसे अपडेट करें?
zakdances

एक हैक उपयोगी है अगर और केवल अगर यह ठीक से पता है कि यह क्यों काम करता है और इसलिए, ध्यान से देखी गई बाधाओं के तहत । आपकी अस्वीकृति के बावजूद, आपका हैक इन मानदंडों को पूरा नहीं करता है ("पूरी तरह से सिस्टम पर निर्भर", "दूर करने के लिए लगता है", "मेरे लिए काम करता है")। यदि हम आपके अस्वीकरण को गंभीरता से लेते हैं, तो किसी को भी आपके हैक का उपयोग नहीं करना चाहिए - और मैं सहमत हूं। तो फिर हमारे हाथ क्या आया? एक शोर व्याकुलता। मुझे दो विकल्प दिखाई देते हैं: (ए) अपने उत्तर को हटा दें, या (बी) इसे एक सावधानी की कहानी में बदल दें, जो बताती है कि क्यों - जैसा कि हो सकता है वैसे ही लुभावना - यह दृष्टिकोण आम तौर पर काम नहीं कर सकता है
mklement0

102

यह अभी भी एक अस्थायी फ़ाइल का उपयोग करता है, लेकिन कम से कम यह एक पंक्ति में है:

echo "text" | cat - yourfile > /tmp/out && mv /tmp/out yourfile

क्रेडिट: BASH: प्रीपेन्ड ए टेक्स्ट / लाइन्स टू ए फाइल


4
क्या कर रहा है -के बाद cat?
मेकबोले

क्या एक नई पंक्ति के बिना "पाठ" जोड़ने का कोई तरीका है?
चिशकु

@ शिखाक्कूecho -n "text"
स्पार्कवाक

3
एक चेतावनी: यदि yourfileएक सिम्लिंक है तो यह वह नहीं करेगा जो आप चाहते हैं।
dshepherd

क्या इसका उत्तर अलग है: "पाठ"> / tmp / out; बिल्ली yourfile >> / tmp / out; एमवी / tmp / बाहर अपनेfile ??
रिचर्ड

31
echo '0a
your text here
.
w' | ed some_file

एड मानक संपादक है! http://www.gnu.org/fun/jokes/ed.msg.html


7
या, सम्मिलित किए जाने वाले पाठ को हार्डकोड करने के बजाय:0r header.file
ग्लेन जैकमैन

चूँकि प्रश्न एक लाइनर के लिए पूछा गया था:echo -e '0a\nyour text here\n.\nw' | ed some_file
20:56

20

जॉन मी: आपकी विधि को काम करने की गारंटी नहीं है, और शायद आप असफल हो जाएंगे यदि आप 4096 से अधिक बाइट सामान (कम से कम यही होता है कि गनु अवेक के साथ होता है, लेकिन मुझे लगता है कि अन्य कार्यान्वयन समान अवरोध होंगे)। न केवल यह उस स्थिति में विफल हो जाएगा, लेकिन यह एक अंतहीन लूप में प्रवेश करेगा जहां यह अपना स्वयं का आउटपुट पढ़ेगा, जिससे फ़ाइल उपलब्ध हो जाएगी जब तक कि सभी उपलब्ध स्थान भर न जाए।

इसे अपने लिए आजमाएँ:

exec 3<>myfile && awk 'BEGIN{for(i=1;i<=1100;i++)print i}{print}' myfile >&3

(चेतावनी: इसे थोड़ी देर बाद मार दें या यह फाइलसिस्टम को भर देगा)

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


6
यह शायद एक टिप्पणी होनी चाहिए, एक अलग जवाब नहीं।
lkraav

10
@ इकारव: हो सकता है, लेकिन "टिप्पणी" बहुत लंबी और विस्तृत (और उपयोगी) है, यह अच्छा नहीं लगेगा और शायद वैसे भी स्टैकऑवरफ्लो की सीमित टिप्पणी क्षमता के साथ फिट नहीं है।
हेंडी इरावन

18

एक अस्थायी फ़ाइल के बिना संभव नहीं है, लेकिन यहां एक ऑनलाइनर जाता है

{ echo foo; cat oldfile; } > newfile && mv newfile oldfile

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


16

यह ध्यान देने योग्य हो सकता है कि अक्सर यह एक अच्छा विचार है कि अस्थायी रूप से एक फ़ाइल का उपयोग कर सुरक्षित रूप से मटकेप जैसी उपयोगिता का उपयोग करके उत्पन्न किया जा सकता है, कम से कम यदि स्क्रिप्ट कभी रूट विशेषाधिकारों के साथ निष्पादित की जाएगी। आप उदाहरण के लिए निम्नलिखित (bash में फिर से) कर सकते हैं:

(tmpfile=`mktemp` && { echo "prepended text" | cat - yourfile > $tmpfile && mv $tmpfile yourfile; } )

15

यदि आपको अपने द्वारा नियंत्रित किए जाने वाले कंप्यूटर पर इसकी आवश्यकता है, तो पैकेज को "अधिक" स्थापित करें और "स्पंज" का उपयोग करें। तो आप कर सकते हैं:

cat header myfile | sponge myfile

यह मेरे लिए अच्छी तरह से काम किया जब @Vinko Vrsalovic के जवाब के साथ संयुक्त:{ echo "prepended text"; cat myfile } | sponge myfile
जेसी

13

Bash heredoc का उपयोग करके आप tmp फ़ाइल की आवश्यकता से बच सकते हैं:

cat <<-EOF > myfile
  $(echo this is prepended)
  $(cat myfile)
EOF

यह काम करता है क्योंकि $ (कैट मायफाइल) का मूल्यांकन तब किया जाता है जब बैश स्क्रिप्ट का मूल्यांकन किया जाता है, इससे पहले कि बिल्ली को पुनर्निर्देशित किया जाए।


9

यह मानते हुए कि जिस फ़ाइल को आप संपादित करना चाहते हैं वह my.txt है

$cat my.txt    
this is the regular file

और जिस फाइल को आप प्रेप करना चाहते हैं वह हैडर

$ cat header
this is the header

हेडर फ़ाइल में एक अंतिम रिक्त पंक्ति होना सुनिश्चित करें।
अब आप इसे पहले से तैयार कर सकते हैं

$cat header <(cat my.txt) > my.txt

आप के साथ अंत

$ cat my.txt
this is the header
this is the regular file

जहाँ तक मुझे पता है यह केवल 'बाश' में काम करता है।


यह काम क्यों करता है? क्या कोष्ठक मध्य बिल्ली को एक अलग शेल में निष्पादित करने और एक बार में पूरी फ़ाइल को डंप करने का कारण बनता है?
कैट्सकुल

मुझे लगता है कि <(cat my.txt) फ़ाइल सिस्टम में कहीं एक अस्थायी फ़ाइल बनाता है। मूल फ़ाइल को संशोधित करने से पहले इस फ़ाइल को पढ़ा जाता है।
cb0

किसी ने एक बार मुझे दिखाया कि आप "<()" सिंटैक्स के साथ क्या कर सकते हैं। हालाँकि मैंने कभी नहीं सीखा कि इस मिथोड को कैसे कहा जाता है और न ही मैं बैश मैनपेज में कुछ खोज सकता हूं। अगर कोई इसके बारे में अधिक जानता है तो कृपया मुझे बताएं।
cb0

1
मेरे लिए काम नहीं किया। पता नहीं क्यों। मैं GNU बैश, संस्करण 3.2.57 (1) -release (x86_64-apple-darwin14) का उपयोग कर रहा हूँ, मैं OS X Yosemite पर हूँ। मैंने this is the headermy.txt की दो पंक्तियों के साथ समाप्त किया । मेरे द्वारा बैश को अपडेट करने के बाद भी मुझे 4.3.42(1)-releaseवही परिणाम मिलता है।
कोहनी रॉबर्ट

1
बैश एक अस्थायी फ़ाइल नहीं बनाता है, यह एक FIFO (पाइप) बनाता है, जिसमें प्रक्रिया प्रतिस्थापन ( <(...)) में कमांड लिखता है, इसलिए कोई गारंटी नहीं है कि my.txtपूर्ण अप फ्रंट में पढ़ा जाता है , जिसके बिना यह तकनीक काम नहीं करेगी।
mklement0

9

जब आप उन चीजों को करने की कोशिश करने लगते हैं जो शेल-स्क्रिप्ट में कठिन हो जाती हैं, तो मैं दृढ़ता से स्क्रिप्ट को "उचित" स्क्रिप्टिंग भाषा (पायथन / पर्ल / रूबी / आदि) में पुन: लिखने का सुझाव दूंगा।

किसी फ़ाइल में किसी पंक्ति को प्रस्तुत करने के लिए, पाइपिंग के माध्यम से ऐसा करना संभव नहीं है, जब आप कुछ भी ऐसा करते हैं cat blah.txt | grep something > blah.txt, तो यह अनजाने में फ़ाइल को खाली कर देता है। एक छोटी उपयोगिता कमांड है जिसे spongeआप इंस्टॉल कर सकते हैं (आप करते हैं cat blah.txt | grep something | sponge blah.txtऔर यह फ़ाइल की सामग्री को बफ़र करता है, फिर इसे फ़ाइल पर लिखता है)। यह एक अस्थायी फ़ाइल के समान है लेकिन आपको स्पष्ट रूप से ऐसा नहीं करना है। लेकिन मैं कहूंगा कि पर्ल की तुलना में यह "बदतर" आवश्यकता है।

हो सकता है कि इसे awk या समान के माध्यम से करने का कोई तरीका हो, लेकिन यदि आपको शेल-स्क्रिप्ट का उपयोग करना है, तो मुझे लगता है कि एक अस्थायी फ़ाइल अब तक का सबसे आसान (/?) तरीका है ..?


7

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

{ echo foo; cat bar; } | tee bar > /dev/null

7

संपादित करें: यह टूट गया है। बिल्ली और टी के साथ एक फ़ाइल को प्रस्तुत करते समय अजीब व्यवहार देखें

समस्या को अधिलेखित करने के लिए समाधान का उपयोग कर रहा है tee:

cat header main | tee main > /dev/null

थोड़ी देर तक लटका रहा। "टी: मुख्य: डिवाइस पर कोई स्थान नहीं बचा" के साथ समाप्त हुआ। मुख्य कई जीबी थे, हालांकि दोनों मूल पाठ फाइलें केवल कुछ KB थीं।
मार्कोस

3
यदि आपके द्वारा पोस्ट किया गया समाधान टूट गया है (और वास्तव में उपयोगकर्ता हार्डड्राइव भरता है), तो समुदाय का पक्ष लें और अपना उत्तर हटा दें।
aioobe

1
क्या आप मुझे एक दिशानिर्देश के लिए इंगित कर सकते हैं जो कहता है कि गलत उत्तरों को हटा दिया जाना चाहिए?
डैनियल वेलकोव

3

वह जो मैं उपयोग करता हूं। यह आपको आदेश, अतिरिक्त वर्ण इत्यादि को निर्दिष्ट करने की अनुमति देता है जिस तरह से आप इसे पसंद करते हैं:

echo -e "TEXTFIRSt\n$(< header)\n$(< my.txt)" > my.txt

पुनश्च: केवल यह काम नहीं कर रहा है यदि फ़ाइलों में बैकस्लैश के साथ पाठ होता है, क्योंकि यह व्याख्या वर्णों के रूप में हो जाता है


3

ज्यादातर मौज-मस्ती / शेल गोल्फ के लिए, लेकिन

ex -c '0r myheader|x' myfile

चाल करेंगे, और कोई पाइपलाइन या पुनर्निर्देशन नहीं हैं। बेशक, vi / ex वास्तव में गैर-उपयोग के लिए नहीं है, इसलिए vi संक्षेप में फ़्लैश होगा।


मेरे दृष्टिकोण से सबसे अच्छा नुस्खा क्योंकि यह एक निपुण कमांड का उपयोग करता है और एक सरल तरीके से करता है।
डिएगो

2

केवल एड कमांड का उपयोग क्यों नहीं किया जाता (जैसा कि पहले से ही यहाँ फ़्लफ़ल द्वारा सुझाया गया है)?

ed पूरी फ़ाइल को मेमोरी में पढ़ता है और स्वचालित रूप से एक इन-प्लेस फ़ाइल एडिट करता है!

इसलिए, यदि आपकी फ़ाइल इतनी बड़ी नहीं है ...

# cf. "Editing files with the ed text editor from scripts.",
# http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed

prepend() {
   printf '%s\n' H 1i "${1}" . wq | ed -s "${2}"
}

echo 'Hello, world!' > myfile
prepend 'line to prepend' myfile

फिर भी एक और समाधान खुले फ़ाइल हैंडल का उपयोग करना होगा जैसा कि sed के s / c / d / 'myFile से Redirect आउटपुट में Jürgen Hötzel द्वारा सुझाया गया है।

echo cat > manipulate.txt
exec 3<manipulate.txt
# Prevent open file from being truncated:
rm manipulate.txt
sed 's/cat/dog/' <&3 > manipulate.txt

यह सब निश्चित रूप से एक ही लाइन पर रखा जा सकता है।


2

निश्चित पाठ को प्रस्तुत करने के लिए "नो टेम्प फाइल" के cb0 के समाधान पर एक संस्करण:

echo "text to prepend" | cat - file_to_be_modified | ( cat > file_to_be_modified ) 

फिर से यह सब-शेल के निष्पादन पर निर्भर करता है - (..) - बिल्ली से बचने के लिए इनपुट और आउटपुट के लिए एक ही फाइल होने से इंकार करना।

नोट: यह समाधान पसंद आया। हालांकि, मेरे मैक में मूल फ़ाइल खो गई है (सोचा कि यह नहीं होना चाहिए लेकिन यह करता है)। आपके समाधान को इस रूप में लिखकर तय किया जा सकता है: गूंज "पाठ को प्रस्तुत करने के लिए" | cat - file_to_be_modified | cat> tmp_file; mv tmp_file file_to_be_modified


1
मुझे भी खोई हुई मूल फ़ाइल मिल गई है। उबंटू लुसिड।
हेजहोग



2

चेतावनी: यह ओपी की जरूरतों को पूरा करने के लिए थोड़ा और काम करने की जरूरत है।

उनकी गलतफहमियों के बावजूद @shixilun काम करके सेड अप्रोच बनाने का एक तरीका होना चाहिए। व्हाट्सएप से बचने के लिए एक बैश कमांड होना चाहिए जब किसी फाइल को एक सेड विकल्प स्ट्रिंग में पढ़ा जाए (जैसे कि newline वर्णों को '\ n' से बदलें। शेल कमांड visऔर catनॉनप्रिंटेबल कैरेक्टर से निपट सकते हैं, लेकिन व्हाट्सएप से नहीं, इसलिए यह ओपी को हल नहीं करेगा। संकट:

sed -i -e "1s/^/$(cat file_with_header.txt)/" file_to_be_prepended.txt

स्थानापन्न स्क्रिप्ट में कच्चे newlines के कारण विफल रहता है, जिसे एक पंक्ति निरंतरता चरित्र () के साथ पहले से तैयार करने की आवश्यकता होती है और संभवतः एक के बाद एक शेल और sed को खुश रखने के लिए, जैसे SO उत्तर।

sed गैर-वैश्विक खोज-प्रतिस्थापित आदेशों (पैटर्न के बाद कोई अनुगामी / छ) के लिए 40K की आकार सीमा होती है, इसलिए संभवतः उस अज्ञात चेतावनी के डरावने बफ़र ओवररन समस्याओं से बचना होगा।



2

साथ $ (आदेश) आप एक चर में एक आदेश के उत्पादन में लिख सकते हैं। तो मैंने इसे तीन कमांडों में एक लाइन में किया और कोई अस्थायी फ़ाइल नहीं।

originalContent=$(cat targetfile) && echo "text to prepend" > targetfile && echo "$originalContent" >> targetfile

1

यदि आपके पास एक बड़ी फ़ाइल (मेरे मामले में कुछ सौ किलोबाइट) और अजगर तक पहुंच है, तो यह catपाइप समाधानों के लिए बहुत तेज है :

python -c 'f = "filename"; t = open(f).read(); open(f, "w").write("text to prepend " + t)'


1

इसके साथ एक समाधान printf:

new_line='the line you want to add'
target_file='/file you/want to/write to'

printf "%s\n$(cat ${target_file})" "${new_line}" > "${target_file}"

आप भी कर सकते हैं:

printf "${new_line}\n$(cat ${target_file})" > "${target_file}"

लेकिन उस मामले में आपको यह सुनिश्चित करना होगा कि %लक्ष्य फ़ाइल की सामग्री सहित कोई भी कहीं भी नहीं है , क्योंकि इसकी व्याख्या की जा सकती है और आपके परिणामों को खराब कर सकती है।


2
ऐसा लगता है कि यदि आपके पास अपनी लक्ष्य फ़ाइल में कुछ भी है तो उसे फूंकें (और अपनी फ़ाइल को काट-छाँट करें!), जो कि प्रिंटफ एक प्रारूपण विकल्प के रूप में व्याख्या करता है।
एलन एच।

echoएक सुरक्षित विकल्प की तरह लगता है। echo "my new line\n$(cat my/file.txt)" > my/file.txt
एलन एच।

@AlanH। मैं जवाब में खतरों से आगाह करता हूं।
user137369

असल में, आप केवल में percents बारे में चेतावनी दी ${new_line}, नहीं लक्ष्य फ़ाइल
एलन एच

क्या आप अधिक स्पष्ट हो सकते हैं? यह वास्तव में एक बड़ी चेतावनी है IMO। "कहीं भी" यह बहुत स्पष्ट नहीं करता है।
एलन एच।

1

आप पर्ल कमांड लाइन का उपयोग कर सकते हैं:

perl -i -0777 -pe 's/^/my_header/' tmp

जहाँ-मैं फ़ाइल का इनलाइन रिप्लेसमेंट बनायेगा और -0777 पूरी फाइल को स्लैप करेगा और केवल शुरुआत से ^ मैच करेगा। -pe सभी लाइनों को प्रिंट करेगा

या अगर my_header एक फ़ाइल है:

perl -i -0777 -pe 's/^/`cat my_header`/e' tmp

जहां / ई प्रतिस्थापन में कोड का एक निकासी की अनुमति देगा।


0
current=`cat my_file` && echo 'my_string' > my_file && echo $current >> my_file

जहां "my_file" "my_string" को प्रस्तुत करने की फ़ाइल है।


0

मुझे @ fluffle का एड सबसे अच्छा रहा है। आखिरकार, किसी भी टूल की कमांड लाइन स्विच बनाम स्क्रिप्टेड एडिटर कमांड अनिवार्य रूप से एक ही चीज है; स्क्रिप्टेड एडिटर सॉल्यूशन "स्वच्छता" को किसी भी तरह से कम या व्हाट्सएप पर नहीं देखना।

यहां मेरा एक-लाइनर संदेश .git/hooks/prepare-commit-msgभेजने के लिए इन-रेपो .gitmessageफ़ाइल को प्रस्तुत करने के लिए संलग्न है :

echo -e "1r $PWD/.gitmessage\n.\nw" | ed -s "$1"

उदाहरण .gitmessage:

# Commit message formatting samples:
#       runlevels: boot +consolekit -zfs-fuse
#

मैं 1rइसके बजाय कर रहा हूं 0r, क्योंकि यह मूल टेम्पलेट से फ़ाइल के ऊपर खाली रेडी-टू-राइट लाइन को छोड़ देगा। अपने ऊपर एक खाली लाइन मत डालो .gitmessage, तुम दो खाली लाइनों के साथ समाप्त हो जाओगे। -sएड के नैदानिक ​​जानकारी आउटपुट को दबा देता है।

इसके माध्यम से जाने के संबंध में, मुझे पता चला कि विम-बफ के लिए भी अच्छा है:

[core]
        editor = vim -c ':normal gg'

0

चर, ftw?

NEWFILE=$(echo deb http://mirror.csesoc.unsw.edu.au/ubuntu/ $(lsb_release -cs) main universe restricted multiverse && cat /etc/apt/sources.list)
echo "$NEWFILE" | sudo tee /etc/apt/sources.list

0

मुझे लगता है कि यह एड का सबसे साफ बदलाव है:

cat myheader | { echo '0a'; cat ; echo -e ".\nw";} | ed myfile

एक समारोह के रूप में:

function prepend() { { echo '0a'; cat ; echo -e ".\nw";} | ed $1; }

cat myheader | prepend myfile

0

यदि आप BASH में स्क्रिप्टिंग कर रहे हैं, वास्तव में, आप बस जारी कर सकते हैं:

बिल्ली - yourfile / tmp / out && mv / tmp / out yourfile

यह वास्तव में कॉम्प्लेक्स उदाहरण में है जिसे आप स्वयं अपने प्रश्न में पोस्ट करते हैं।


एक संपादक ने इसे बदलने का सुझाव दिया cat - yourfile <<<"text" > /tmp/out && mv /tmp/out yourfile, हालांकि यह मेरे उत्तर से पर्याप्त रूप से भिन्न है कि यह स्वयं का उत्तर होना चाहिए।
टिम कैनेडी

0

IMHO कोई खोल समाधान है (और कभी नहीं होगा) कि लगातार और मज़बूती से जो कुछ भी दो फ़ाइलों के आकार काम करेगा myheaderऔर myfile। इसका कारण यह है कि यदि आप ऐसा करना चाहते हैं, तो बिना किसी अस्थायी फ़ाइल में आए (और शेल को चुपचाप अस्थायी फ़ाइल में जाने के बिना, जैसे निर्माण के माध्यम से exec 3<>myfile, पाइपिंग से tee, आदि)।

"वास्तविक" समाधान जिसे आप फाइल सिस्टम के साथ फील करना चाहते हैं, और इसलिए यह यूजर्सस्पेस में उपलब्ध नहीं है और प्लेटफॉर्म-डिपेंडेंट होगा: आप फाइल सिस्टम पॉइंटर myfileके वर्तमान मान से उपयोग में फाइलसिस्टम पॉइंटर को संशोधित करने के लिए कह रहे हैं। के लिए myheaderऔर फाइल सिस्टम में की जगह EOFके myheaderद्वारा बताया वर्तमान फाइल सिस्टम का पता करने के लिए एक श्रृंखलित लिंक के साथ myfile। यह तुच्छ नहीं है और स्पष्ट रूप से एक गैर-सुपरयुसर द्वारा नहीं किया जा सकता है, और शायद सुपरयूजर द्वारा भी नहीं किया जा सकता है ... इनोड्स के साथ खेलें, आदि।

यद्यपि आप लूप डिवाइस का उपयोग करके इसे कम या ज्यादा नकली बना सकते हैं। उदाहरण के लिए यह SO थ्रेड देखें ।

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