पाठ फ़ाइल की सामग्री को खाली करना


16

मेरे घर निर्देशिका में एक पाठ फ़ाइल है जो क्रोन जॉब के माध्यम से नियमित रूप से डेटा प्राप्त करती है। क्योंकि क्रोन जॉब डायनेमिक डेटा प्रदान करता है, इसलिए मैं फाइल कंटेंट (फ़ाइल अभी भी मौजूद होना चाहिए) को खाली करने के लिए क्रोन जॉब सेट करना चाहता हूं। मुझे क्रॉन की मदद की ज़रूरत नहीं है, बस कमांड जो फ़ाइल को खाली करने में मदद कर सकती है।


5
वैकल्पिक: tail -n +1000 file.txt > file.txt1000 लाइनों को हटा देना चाहिए और फ़ाइल में सबसे नई लाइनों को रखना चाहिए (आपको कभी नहीं पता होगा कि आपको कुछ ट्रैक करने के लिए हाल के रिकॉर्ड की आवश्यकता हो सकती है)।
रिनजविंड

2
यह वास्तव में निर्धारित समय पर फ़ाइल को साफ़ करने से बेहतर विकल्प है।
ब्रूनो परेरा

1
@Rinzwind, कि फ़ाइल को पढ़ने की कोशिश करने से पहले फ़ाइल के टुकड़े-टुकड़े हो जाने के बाद से यह काम नहीं करेगा। आपको एक नई फ़ाइल पर पुनर्निर्देशित करने की आवश्यकता है, और फिर मूल को नए के साथ बदलें।
psusi

सच @psusi :) वहाँ एक अतिरिक्त पुनर्निर्देशित करने की आवश्यकता है।
रिनजविंड

जवाबों:


28

सबसे सरल तरीका:

> filename

यह एक कम स्पष्ट तरीका है और दूसरों द्वारा शेल स्क्रिप्ट में शायद कम पठनीय है, लेकिन यह आप सभी की जरूरत है।

क्योंकि >वास्तव में एक वास्तव में कमांड नहीं है (यह बैश बिलिन है) जिसका आप उपयोग नहीं कर सकते हैं:

sudo > filename

जब आपके पास उस फ़ाइल पर अनुमति नहीं है। लेकिन आप उपयोग कर सकते हैं:

sudo bash -c "> filename"

किस प्रकार की अनुमतियों को बदलने की आवश्यकता है क्योंकि यह अनुमति से इनकार करता है, मैंने फ़ाइल में पहले से ही 755 chmod किया है, या क्या मुझे इसे एक नया पोस्ट करना चाहिए (मेरा मतलब है प्रश्न)
sosytee

@sosytee मेरे नए संपादन देखें।
राडू रियडेनू

1
@sosytee बेशक आप कर सकते हैं, लेकिन sudo crontab -eजड़ के लिए क्रॉन जॉब जोड़ने के लिए उपयोग करें, आपके लिए नहीं। या फ़ाइल की अनुमति को 766 में बदलें (या 666), 755 पर नहीं sudo chmod 766 filename:। के बारे में अधिक: codex.wordpress.org/Changing_File_Pches
Radu Rădeanu

1
truncate filenameफ़ाइल को खाली आउटपुट पुनर्निर्देशित करने की तुलना में थोड़ा क्लीनर और सरल है और समस्याओं के साथ नहीं चलता है sudo
psusi

1
@psusi truncate -s 0 filenameवास्तव में चाल बना सकता है। आप इसे उत्तर के रूप में जोड़ सकते हैं।
राडू रियडेनू

19

उस उद्देश्य के लिए एक उपकरण बनाया गया है:

truncate -s 0 filename

इससे सामग्री साफ हो जाएगी लेकिन यह अभी भी एक ही फाइल होगी ( इनोड वही रहती है)।

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

इस उत्तर के अंत में अधिक जानकारी के लिए कुछ लिंक।


एक और तरीका, शायद याद रखना आसान है:

echo -n > filename

यह भी समान आवक रखता है।

नोट दोनों कि truncateऔर echo -nसे परिभाषित नहीं कर रहे हैं POSIX

POSIX अनुपालन उपयोग के लिए cat /dev/null:

cat /dev/null > filename

फिर भी एक और तरीका, अधिक अस्पष्ट और शायद अज्ञेय नहीं है:

> filename

यदि फ़ाइल को अलग करने के लिए रूट विशेषाधिकारों को लिखने की जरूरत है तो निम्नलिखित पंक्तियां उतनी कारगर नहीं होंगी जितनी कि अपेक्षित है:

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

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

वर्कअराउंड इस तरह से sudo विशेषाधिकार का उपयोग करके निष्पादित शेल में पुनर्निर्देशन को स्थगित करना है:

sudo sh -c "echo -n > filename"

उपयोग करने के लिए truncateआपको इस तरह के वर्कअराउंड की आवश्यकता नहीं होती है क्योंकि लिखने की पहुंच शेल द्वारा नहीं की जाती है, लेकिन इसके द्वारा truncatesudo विशेषाधिकार का उपयोग करके sudo द्वारा निष्पादित किया जाता है।

sudo truncate -s 0 filename

फ़ाइल को खुले रखने वाले प्रोग्राम के बारे में कुछ विवरण के लिए भले ही फ़ाइल को हटा दिया गया हो, आप निम्न को पढ़ सकते हैं:


यह कहता है कि अनुमति से वंचित, chmod 755 फ़ाइल नाम का उपयोग किया है, लेकिन अभी भी अनुमति से इनकार कर दिया है
sosytee

2
शायद आपने nashlobber को bash में सक्षम किया है?
lesmana

अब तक का सबसे पूर्ण उत्तर
अब्देलहेडी

4

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

लॉगऑट्रेट को कॉन्फ़िगर करने के तरीके पर एक नज़र डालें: http://linuxcommand.org/man_pages/logrotate8.html


1
मैं स्वयं इस विकल्प का पक्ष लेता हूं। हम "फाइल> 10 एमबी" -> "टारगेज टू बैकअप" "खाली फाइल" का उपयोग करते हैं। और बैकअप 900 दिनों के बाद डिलीट हो जाते हैं।
रिनविविंड

3

echo "" > foo_fileजाता है कि ऐसा करने का एक आसान तरीका है, यह की सभी सामग्री का स्थान ले लेगा foo_file साथ "" यह इस मामले में कर रही है, खाली।

आप यह भी उपयोग कर सकते हैं cat /dev/null > foo_file, कि अशक्त डिवाइस को पढ़ा जाएगा और आपकी फ़ाइल को कुछ भी नहीं के साथ अधिलेखित कर देगा।


यह कहता है कि अनुमति से वंचित, chmod 755 फ़ाइल नाम का उपयोग किया है, लेकिन अभी भी अनुमति से इनकार कर दिया है
sosytee

क्या आप कृपया अपने सामान्य उपयोगकर्ता के साथ फ़ाइल अनुमतियाँ पढ़ सकते हैं?
ब्रूनो परेरा

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