एक बड़ी फ़ाइल को अलग करने के लिए यूनिक्स शैल स्क्रिप्ट


87

मैं एक यूनिक्स स्क्रिप्ट लिखने की कोशिश कर रहा हूं, जो एक फ़ाइल को लगातार खाली / खाली कर देगा / सकती है जब किसी एप्लिकेशन द्वारा इसे 3GB स्थान तक पहुंचने पर लिखा / खोला जा रहा है। मुझे पता है कि नीचे की कमान यह करेगी:

cp /dev/null [filename]

लेकिन मैं इसे एक उत्पादन वातावरण में स्वचालित रूप से एक क्रॉन जॉब के रूप में चलाने जा रहा हूं - बस यहां पोस्टिंग यह देखने के लिए कि क्या आप लोगों ने इस तरह के कुछ करने के दौरान किसी भी मुद्दे का सामना किया।


ये ठेस हैं। लॉग का मूल्य नहीं है? मैं अपने उत्पादन लॉग को एक साल + (bzip2 -9 fmt में) रखने के लिए भाग्यशाली था और कुछ छोटी उपयोगिताएँ थीं, जिससे नौकरी के रनटाइम, रिकॉर्ड किए गए रिकॉर्ड निकालने में आसानी हुई, और जब एक स्प्रेडशीट में लोड किया गया तो अनुपातों की गणना करना और ग्राफ़ बनाना आसान था और सामान का एक गुच्छा। लोड-अनुपात गिरने के कारण हमने एक hdwr समस्या की खोज की। हां, वहां से प्यारे निगरानी उपकरण हैं, इसलिए यह सब आपकी स्थिति पर निर्भर करता है। एक अलग विकल्प के रूप में, क्या आपने देखा है logrotate, यह आपको कुछ मूल्य प्रदान कर सकता है (लेकिन इसे स्थापित करने के साथ गुस्सा हो रहा है (बस अनुमान लगा रहा है!)।
शेल्टर

5
ध्यान दें कि यदि लॉग फ़ाइल O_APPEND ध्वज के साथ खोली जाती है, तो ट्रंकेशन प्रभावी है। यदि इसे O_APPEND ध्वज के साथ नहीं खोला गया है, तो प्रोग्राम ऑफसेट 3 GiB (पहली बार) पर लिखना जारी रखेगा; सिस्टम पहले 3 GiB को ऑल-बाइट्स-शून्य (जो अच्छी तरह से संपीड़ित करता है) के रूप में व्यवहार करेगा, लेकिन फ़ाइल बढ़ती रहेगी। यह सब लॉग लिखने वाले प्रोग्राम पर निर्भर करता है।
जोनाथन लेफ्लर 1

जवाबों:


116

बस एक और उत्तर जोड़ने के लिए,

: > filename

: bash (POSIX-compliant) में एक no-op है, इसलिए यह अनिवार्य रूप से केवल लिखने के लिए फ़ाइल खोलता है (जो कि निश्चित रूप से फ़ाइल को छोटा करता है) और फिर तुरंत इसे बंद कर देता है।

संपादित करें: जैसा कि शेल्टर ने टिप्पणी की थी, आपको पुनर्निर्देशन के साथ जाने के लिए वास्तव में एक कमांड की आवश्यकता नहीं है:

$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$

एक साधारण पुनर्निर्देशन अपने आप फाइल को साफ कर देगा।


25
या बस > filename(जैसा कि मुझे यकीन है कि आप जानते हैं)। आप सभी को शुभकामनायें।
शेल्टर

5
@ शेल्टर "$> फ़ाइल" POSIX नहीं और पोर्टेबल नहीं। जैसा कि शुरू में सुझाव दिया गया था, आपको पुनर्निर्देशन से पहले ":" नो-ऑप कमांड का उपयोग करना चाहिए।
आरोन टोपोनस

2
+ स्माइली चेहरे के लिए प्लस
क्रिस सुसज़ी

2
जैसा कि @AaronToponce ने बताया, "$> फ़ाइल" वास्तव में पोर्टेबल नहीं है; मेरे Zsh सेटअप पर यह शेल हैंग करता है (माना जाता है कि इनपुट की प्रतीक्षा कर रहा है)। "$:> फ़ाइल" Zsh में ठीक काम करता है।
लीनस एवर

1
@TechEnthyer यह आपकी अपेक्षा पर निर्भर करता है। ट्रंकेशन स्वयं परमाणु है, लेकिन आप वास्तव में नहीं जानते कि यह किसी विशेष लेखन के सापेक्ष कब होगा। उदाहरण के लिए, आप फ़ाइल की शुरुआत में एक आंशिक लाइन के साथ हवा कर सकते हैं।
चेपनर

65

मैंने डेबियन पर निम्न कमांड का उपयोग किया है

truncate -s 0 filename

@SteveClay: sudo sh -c ': > filename'भी छोटा होगाfilename
Perleone

2
@SteveClay ऑप्स सुझाव भी साथ दोषरहित काम करता है sudo: sudo cp /dev/null filename। इसके अलावा cpपोर्टेबल है जबकि truncateआधुनिक लिनक्स ही है।
टिनो

11

जो मुझे उचित लगता है। बेशक, यूनिक्स आपको लगभग 50 अलग-अलग तरीकों से ऐसा करने देगा। उदाहरण के लिए,

echo -n "" >filename
cat /dev/null >filename

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