कैसे ("ट्रंकट") को खाली करने के लिए लिनक्स पर एक फ़ाइल जो पहले से मौजूद है और किसी में संरक्षित है?


113

मेरे पास एक फ़ाइल है, जिसे एरर कहते हैं। मेरे सर्वर पर जिसे मुझे बार-बार काटना पड़ता है। मेरे पास फ़ाइल के लिए rw अनुमतियां हैं। Vi में फ़ाइल खोलना> सभी सामग्री को हटाना> काम करता है (स्पष्ट रूप से) बचत। लेकिन जब मैं नीचे की कोशिश करता हूं

cat /dev/null > error.log

मुझे संदेश मिला है

File already exists.

स्पष्ट रूप से फ़ाइलों के आकस्मिक ओवरराइडिंग को रोकने के लिए सर्वर पर किसी प्रकार का कॉन्फ़िगरेशन होता है। क्या कोई बता सकता है कि मैं एक ही कमांड में फ़ाइल को "कैसे काट" ​​सकता हूं?


2
गैर-संरक्षित फ़ाइल ट्रंकट -s के लिए 0 फ़ाइल काम करती है।
प्रमोद

जवाबों:


158

आपके पास noclobberविकल्प सेट है। त्रुटि ऐसा लगता है कि यह csh से है, इसलिए आप ऐसा करेंगे:

cat /dev/null >! file

अगर मैं गलत हूं और आप बैश का उपयोग कर रहे हैं, तो आपको करना चाहिए:

cat /dev/null >| file

बाश में, आप इसे भी छोटा कर सकते हैं:

>| file

आप खोल csh होने के बारे में सही हैं। आप कैसे जानते हैं?
सुमीत पारीक

6
@Wikidkaka - त्रुटि संदेश पर आधारित है। मेरे सिस्टम पर csh समान File existsत्रुटि देता है जबकि bash बहुत अलग cannot overwrite existing fileत्रुटि देता है ।
आर सैमुअल क्लैचको

6
@ जरमुंड - क्योंकि उपयोगकर्ता के पास noclobber सेट है, >fileकाम नहीं करता है।
आर सैमुअल क्लैचको

बीच क्या अंतर है > fileऔर >| file?
विल

1
@Will - यदि आपके पास noclobberविकल्प सेट है, तो किसी मौजूदा फ़ाइल को पुनर्निर्देशित करने का प्रयास विफल रहता है। Noclobber को छोड़ते समय विशिष्ट पुनर्निर्देशन के लिए ओवरराइड करने के लिए, आप उपयोग कर सकते हैं>|
R सैमुअल क्लैचको

71

आप फ़ंक्शन ट्रंकट का उपयोग भी कर सकते हैं

$truncate -s0 yourfile

यदि अनुमति से इनकार किया जाता है, तो sudo का उपयोग करें

$sudo truncate -s0 yourfile

हेल्प / मैनुअल: मैन ट्रंकट

ubuntu लिनक्स पर परीक्षण किया गया


1
truncate फ़ाइल के संशोधन समय को भी छूता है - जबकि "> फ़ाइल" स्पर्श नहीं करता है यदि फ़ाइल अपरिवर्तित है।
dsteinkopf

यह उस डिस्क स्थान को रिलीज़ नहीं करता है जो फ़ाइल रखता है। सबसे पहले यह 0 बाइट दिखाता है। लेकिन जब आप उस फ़ाइल में कुछ लिखते हैं, तो फ़ाइल का आकार = छोटा डेटा + नए डेटा आकार से पहले होता है।
अनिकेत कुलकर्णी

48

यह फ़ाइल का आकार 0 पर सेट करने के लिए पर्याप्त होगा:

> error.log

6
वास्तव में, यह noclobber के साथ काम नहीं करता है (इसे स्वयं परीक्षण किया गया है), इसलिए यह इस मामले में एक वैध समाधान नहीं है ("-बैश: त्रुटि .log: मौजूदा फ़ाइल को अधिलेखित नहीं कर सकता"); ऊपर सराहें देखें ("@Jarmund - क्योंकि उपयोगकर्ता के पास noclobber सेट है,> फ़ाइल काम नहीं करती है।")। मैं सोच रहा हूँ कि इस तरह के "बुद्धिमान लोग" किस तरह से स्पष्ट रूप से गलत जवाब देते हैं ...

9

इसका श्रेय मेरे वरिष्ठ सहयोगी को जाता है:

:> filename

यह लॉग फ़ाइलों को नहीं तोड़ देगा, इसलिए आप इसे उदाहरण के लिए, syslog पर भी उपयोग कर सकते हैं।


8
कृपया समझाएँ। यह कैसे काम करता है? वह अंकन क्या कर रहा है?
user31986

2
@ user31986 :एक नो-इफ़ेक्ट कमांड (लगभग एक टिप्पणी) है, फिर >हमेशा की तरह पुनर्निर्देशन होता है, इस प्रकार यह सिर्फ कमांड की आउटपुट की कमी को रीडायरेक्ट करता है जो फ़ाइल में कुछ भी नहीं करता है। यदि noclobber सक्षम है, तो आपको :>| filename(bash) की आवश्यकता है (और मैं :>! filenamecsh में csh है मान लें :)।
रोडबार

4

झूठी | टी फ़ाइल

साथ ही काम कर सकते हैं


वह मूर्खतापूर्ण है। या अगर यह उपयोगी है, तो अस्पष्ट रूप ddसे आउटपुट के लिए कुछ भी प्राप्त करना सादा पठनीय से बेहतर नहीं होगा false?
ट्रिपलए

2

चूंकि सूडो पुनर्निर्देशन के साथ काम नहीं करेगा >, इसलिए मुझे teeइस उद्देश्य के लिए कमांड पसंद है

echo "" | sudo tee fileName

ठीक है, वास्तव में यह करता है, जैसा कि आपके द्वारा जुड़े और यहां ऊपर दिए गए प्रश्न दोनों में वर्णित है। "sudo sh -c '>

यह लक्ष्य फ़ाइल पर अनुमतियों पर निर्भर करता है error.log, अगर यह पहले से ही योग्य है तो sudo की आवश्यकता नहीं है। मुझे लगता है कि अन्य मुद्दा यह है कि आप कमांड को स्ट्रिंग तर्क के रूप में पारित कर रहे हैं sh, मुझे नहीं पता कि आंतरिक रूप से कैसे संभाला जाता है, लेकिन यह जटिलता की एक और परत है / पुनर्निर्देशन जोड़ा गया
sakhunzai

1
यह वास्तव में फ़ाइल को छोटा नहीं करेगा, क्योंकि echo ""यह एक नई पंक्ति जोड़ देगा। आप echo -n ""न्यूलाइन को दबाने के लिए उपयोग कर सकते हैं
सेब

0

कोई भी इस कमांड को लिनक्स सिस्टम में किसी भी फाइल को छोटा करने की कोशिश कर सकता है

यह निश्चित रूप से किसी भी प्रारूप में काम करेगा:

truncate -s 0 file.txt


-4

आप भी आजमा सकते हैं:

echo -n > /my/file


8
एक टन वोट से जवाब देखें? इसे पढ़ने की कोशिश करो, और देखो noclobberऔर फिर अपने आप से पूछें कि क्या आपका जवाब बिल्कुल भी समझ में आता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.