จะตัดไฟล์ให้มีขนาดที่กำหนดภายใต้ Linux ได้อย่างไร


19

ฉันต้องการลดขนาดไฟล์โดยใช้กำลังดุร้ายนั่นคือฉันไม่สนใจที่เหลือฉันแค่ต้องการตัดไฟล์พูดครึ่งแล้วทิ้งส่วนที่เหลือ

สิ่งแรกที่มาคิดเป็นของ Perl ตัด ฉันกำลังติดตามตัวอย่างในหน้านั้นและทำสิ่งเดียวกัน:

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 :

truncate --size=1G test.txt

SIZE สามารถระบุเป็นไบต์, KB, K, MB, M เป็นต้นฉันคิดว่าคุณสามารถคำนวณขนาดที่ต้องการด้วยมือ มิฉะนั้นคุณอาจใช้คำสั่ง stat เพื่อรับข้อมูลเกี่ยวกับขนาดปัจจุบันของไฟล์


ใช้เอกสาร (ในรูปแบบข้อมูล) จาก coreutils
Cristian Ciupitu

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เพื่อตัด 100,000 ไบต์ล่าสุดตัวอย่าง:

tail -c 100000 ไฟล์> file2

-c ส่งเอาต์พุต 100,000 ไฟล์สุดท้ายของไฟล์สำหรับตัวเลือกเพิ่มเติม:

หางมนุษย์

ในการแทนที่ไฟล์ต้นฉบับด้วยไฟล์ที่คุณเพิ่งสร้างขึ้น:

ไฟล์ mv file2


2

คำตอบข้างต้นอ้างถึงการตัดทอนเป็นสิ่งที่ดี ddจะทำงานเช่นกัน:

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

1
วลีสำคัญคือ"ตามขนาดที่กำหนด"กล่าวคือ 1,000 ฉันจะเปลี่ยนคำตอบให้กับคำที่โหวตมากที่สุดแทนซึ่งใช้งานได้กับอินพุตแบบทันทีไม่จำเป็นต้องใช้ไฟล์ระดับกลาง
xpt

0

มีวิธีที่แตกต่างอย่างสิ้นเชิงในการทำเช่นนี้กับ bash โดยใช้โปรแกรม ed สคริปต์ต่อไปนี้จะเก็บรักษาเฉพาะ 5,000 บรรทัดสุดท้ายของไฟล์ทั้งหมดที่อยู่ในไดเรกทอรีที่ระบุ สามารถแก้ไขได้อย่างง่ายดายเพื่อวนซ้ำหลายไดเรกทอรีเปลี่ยนจำนวนบรรทัดเป็นต้น

#!/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.