लिनक्स के तहत किसी दिए गए आकार में फ़ाइल कैसे काटें?


19

मैं जानवर के बल द्वारा फ़ाइल के आकार को छोटा करना चाहता हूं, अर्थात, मुझे बाकी चीजों की परवाह नहीं है, मैं बस फाइल को काटना चाहता हूं, आधे से कहना चाहता हूं, और बाकी को त्याग देता हूं।

पहली बात जो दिमाग में आती है वह है पर्ल का ट्रंकटेट । मैं उस पृष्ठ पर उदाहरण का अनुसरण कर रहा हूं और ठीक यही काम किया है:

seq 9 > test.txt
ls -l test.txt
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

लेकिन फ़ाइल का आकार अभी भी समान है:

$ ls -lgG test.txt
-rw-rw---- 1 18 2013-08-08 09:49 test.txt

मै इसे काम मे कैसे ले सकता हूँ?

जवाबों:


62

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

truncate --size=1G test.txt

आकार बाइट्स, KB, K, MB, M, आदि के रूप में निर्दिष्ट किया जा सकता है। मुझे लगता है कि आप हाथ से वांछित आकार की गणना कर सकते हैं; यदि नहीं, तो आप संभवतः फ़ाइल के वर्तमान आकार के बारे में जानकारी प्राप्त करने के लिए स्टेट कमांड का उपयोग कर सकते हैं।


इसका प्रलेखन (सूचना प्रारूप में) कोर्यूटिल्स से।
क्रिस्टियन सियुपिटु

21
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

पढ़ने के लिए फ़ाइल खोलता है। हालाँकि, आपको जिस फ़ाइल को संशोधित करने की आवश्यकता है, उसे छोटा करना है, इसलिए केवल पढ़ने के लिए फ़ाइल हैंडल काम नहीं कर रहा है। आपको "संशोधित" मोड ( "+>") का उपयोग करने की आवश्यकता है ।

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

निम्नलिखित कुछ और अधिक उपयोगी होता:

perl -we 'open(FILE, "<", "./test.txt") or die "open: $!";
          truncate(FILE, 8) or die "truncate: $!";
          close(FILE);'

हालांकि माना जाता है कि केवल "अमान्य तर्क" की सूचना होगी। फिर भी, यह उपयोगी जानकारी है और अच्छी तरह से आपको इस निष्कर्ष पर पहुंचा सकता है कि ओपन मोड गलत था (जैसा कि मेरे लिए था)।


3

आप tailअंतिम 100000 बाइट्स काटने के लिए उपयोग कर सकते हैं , उदाहरण:

पूंछ -c 100000 फ़ाइल> फ़ाइल 2

-c अधिक विकल्पों के लिए फ़ाइल के अंतिम 100000 बाइट्स को आउटपुट करता है:

आदमी पूंछ

मूल फ़ाइल को केवल आपके द्वारा बनाई गई फ़ाइल से बदलने के लिए:

mv file2 फाइल


2

ट्रंकट का हवाला देते हुए ऊपर का जवाब अच्छा है। dd भी करेगा काम:

dd if=test.txt of=test2.txt bs=1 count=8
mv test2.txt test.txt

1
कुंजी वाक्यांश "एक दिए गए आकार के लिए" है , 1000 का कहना है। मैं इसका जवाब सबसे ज्यादा वोट देने वाले व्यक्ति को दूंगा, जो कि ऑन-द-फ्लाई इनपुट पर काम करता है - कोई मध्यवर्ती फ़ाइल की आवश्यकता नहीं है।
xpt

0

एड प्रोग्राम का उपयोग करते हुए, बैश के साथ ऐसा करने का एक बिल्कुल अलग तरीका है। निम्नलिखित स्क्रिप्ट निर्दिष्ट निर्देशिका में बैठे सभी फाइलों की केवल अंतिम 5000 लाइनों को बनाए रखेगा। यह आसानी से कई निर्देशिकाओं पर लूप को संशोधित कर सकता है, लाइनों की संख्या बदल सकता है, आदि।

#!/bin/bash

LOGDIR=/opt/log
SAVELINES=5000

dirs="$LOGDIR"
for dir in $dirs ; do
    files=${dir}/*
    for f in $files ; do
        echo -e "1,-${SAVELINES}d\nwq" | ed $f 1>/dev/null 2>&1
    done
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.