किसी फ़ाइल की सामग्री को खाली करें


220

मैं एक फ़ाइल से सभी प्रविष्टियों को हटाने के तीन तरीकों से अवगत हूं।

वो हैं

  • >filename
  • touch filename
  • filename < /dev/null

इन तीनों में से मैं >filenameसबसे अधिक दुरुपयोग करता हूं जिसके लिए कम से कम कीस्ट्रोक्स की आवश्यकता होती है।

हालाँकि, मैं जानना चाहूंगा कि बड़ी लॉग फ़ाइलों और छोटी फ़ाइलों के संबंध में तीनों में से सबसे अधिक कुशल (यदि कोई अधिक कुशल तरीके हैं)।

इसके अलावा, तीन कोड सामग्री को कैसे संचालित और हटाते हैं?


24
किस बारे में truncate -s 0 filename?
मार्टिन थोमा


यदि बैश कमांड लाइन से कॉल किया जाता है तो सबसे पहले काम किया जाएगा, लेकिन अगर .sh फ़ाइल में निष्पादित नहीं किया जाएगा तो काम नहीं करेगा
मार्को मार्सला

8
स्पर्श सामग्री को हटाता नहीं है, लेकिन फ़ाइल पर पहुंच का समय बदलता है। यदि कोई मौजूद नहीं है तो यह एक खाली फ़ाइल बनाता है
hbogert

जवाबों:


293

दरअसल, दूसरा फॉर्म touch filenameफाइल से कुछ भी डिलीट नहीं करता है - यह केवल एक खाली फाइल बनाता है यदि कोई मौजूद नहीं था, या किसी मौजूदा फाइल की अंतिम संशोधित तारीख को अपडेट करता है।

और तीसरा इनपुट के रूप में filename < /dev/nullफ़ाइल नाम चलाने की कोशिश करता है /dev/null

cp /dev/null filename काम करता है।

कुशल के लिए, सबसे कुशल होगा truncate -s 0 filename; यहाँ देखें: http://linux.die.net/man/1/truncate

अन्यथा, cp /dev/null filenameया > filenameदोनों ठीक हैं। वे दोनों खोलते हैं और फिर फ़ाइल को बंद कर देते हैं, ट्रंक-ऑन-ओपन सेटिंग का उपयोग करते हुए। cpयह भी खुलता है /dev/null, जिससे यह थोड़ा धीमा हो जाता है।

दूसरी ओर, truncateसंभावना से धीमी होगी > filenameजब स्क्रिप्ट से चलाया जाएगा क्योंकि ट्रंकट कमांड को चलाने के लिए सिस्टम को निष्पादन योग्य को खोलने, लोड करने और इसे चलाने की आवश्यकता होती है।


9
तो आप यह क्यों कहते हैं कि truncateसबसे कुशल है?
स्टीफन चेज़लस

7
ट्रंकट ऑपरेशन, फ़ुटनकेट () या ट्रंकट () सिस्टम कॉल का उपयोग करता है जो फ़ाइल को खोलने के लिए परेशान नहीं करता है। यह भी बंद () सिस्टम कॉल से बचता है कि cp और > filenameतरीकों को कॉल करने की आवश्यकता होती है।
राख

3
वास्तव में, यह (कम से कम GNU एक) एक खुली + ftruncate + बंद करता है (कई सिस्टम कॉल के अलावा यह लोड और खुद को इनिशियलाइज़ करने के लिए करता है), वैसे भी, यह फ़ाइल बनाना होगा यदि यह मौजूद नहीं था और truncate(2)ऐसा नहीं करता।
स्टीफन चेजलस

यदि हम उपयोग करते हैं touch filename, तो क्या इनोड वही रहेगा (बशर्ते पहले कोई फ़ाइल थी)?
pMan

1
@pMan हाँ, आप इसे कोशिश करते हैं और साथ जांच कर सकते हैंls -i
terdon


3

एक अंतर्निहित कमांड ":" है, जो कि sh, csh, bash और अन्य में उपलब्ध है, हो सकता है, जो आसानी से >एक फ़ाइल को पुनर्निर्देशित आउटपुट ऑपरेटर के साथ प्रयोग किया जा सकता है :

#!/usr/bin/env bash
:> filename

इस पर मुझे जो अच्छा लगता है, वह यह है कि इसे "इको" आदि किसी भी बाहरी कमांड की आवश्यकता नहीं है।

डिलीट / रीक्रिएट करने के बजाय फाइलों को रौंदने का एक बड़ा फायदा यह है कि रनिंग एप्लिकेशन जो इस फाइल के साथ काम करती हैं (जैसे कोई व्यक्ति tail -f filenameएक मॉनिटरिंग सॉफ्टवेयर बनाता है , ...) इसे फिर से खोलने की जरूरत नहीं है। वे बस दर्जकर्ता का उपयोग करना जारी रख सकते हैं और सभी नए डेटा प्राप्त कर सकते हैं।


man bash:बिना किसी प्रभाव के शेल शेल का वर्णन करता है।
हेक्सील

हां, और आप इसे >फ़ाइल के साथ पुनर्निर्देशित करते हैं, जो फ़ाइल को बनाता है यदि यह मौजूद नहीं है, और यदि यह मौजूद है तो आप इसे शून्य पर काटते हैं। बेहतर ने कहा: आप :कुछ भी नहीं करने के लिए उपयोग करते हैं, और >एक फ़ाइल के लिए कुछ भी नहीं पुनर्निर्देशित करने के लिए उपयोग करते हैं , और इसे काटते हैं।
मिरको स्टीनर

1
तुम ऐसा क्यों करोगे? > fileएक फ़ाइल को छोटा करने के लिए पर्याप्त है। आपको किसी भी कमांड की आवश्यकता नहीं है, बस पुनर्निर्देशन ऑपरेटर।
terdon

1
कभी-कभी, > filenameकाम नहीं करेगा। उदाहरण के लिए, zsh में। लेकिन फिर : > filenameभी काम करता है।
सीएस पेई

बैश और श > myfileजैसे लगते हैं, लेकिन उदाहरण के लिए csh त्रुटियाँ: अमान्य अशक्त कमांड।
मिरको स्टीनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.