Unix เชลล์สคริปต์เพื่อตัดทอนไฟล์ขนาดใหญ่


87

ฉันกำลังพยายามเขียนสคริปต์ Unix ซึ่งจะตัดทอน / ว่างไฟล์ซึ่งแอปพลิเคชันเขียน / เปิดอย่างต่อเนื่องเมื่อมีพื้นที่ถึง 3GB ฉันรู้ว่าคำสั่งด้านล่างจะทำ:

cp /dev/null [filename]

แต่ฉันจะเรียกใช้สิ่งนี้ในสภาพแวดล้อมการผลิตโดยอัตโนมัติในฐานะงาน cron - เพียงโพสต์ที่นี่เพื่อดูว่าพวกคุณประสบปัญหาใด ๆ ในขณะที่ทำสิ่งที่คล้ายกันนี้หรือไม่


พวกนี้แยง บันทึกไม่มีค่า? ฉันโชคดีที่เก็บบันทึกการผลิตของฉันไว้เป็นเวลาหนึ่งปี + (เป็น bzip2 -9 fmt) และมียูทิลิตี้เล็ก ๆ น้อย ๆ ที่ทำให้ง่ายต่อการแยกเวลาทำงานบันทึกที่ประมวลผลและเมื่อโหลดลงในสเปรดชีตก็ง่ายต่อการคำนวณและอัตราส่วนการโหลดกราฟ และสิ่งของมากมาย เราพบปัญหา hdwr เนื่องจากอัตราส่วนการโหลดลดลง ใช่มีเครื่องมือตรวจสอบที่น่ารักอยู่ที่นั่นดังนั้นทุกอย่างขึ้นอยู่กับสถานการณ์ของคุณ ในฐานะที่เป็นตัวเลือกแยกต่างหากคุณดูlogrotateแล้วมันอาจให้คุณค่าบางอย่างแก่คุณ (แต่น่ารำคาญกับการตั้งค่า (แค่เดา)!)
shellter

5
โปรดสังเกตว่าถ้าไฟล์บันทึกถูกเปิดด้วยแฟล็ก O_APPEND การตัดทอนจะมีผล หากไม่ได้เปิดด้วยแฟล็ก O_APPEND โปรแกรมจะเขียนต่อที่ออฟเซ็ต 3 GiB (ครั้งแรก) ระบบจะถือว่า 3 GiB แรกเป็น all-bytes-zero (ซึ่งบีบอัดได้ดี) แต่ไฟล์จะยังคงเติบโตต่อไป ทั้งหมดขึ้นอยู่กับโปรแกรมที่เขียนบันทึก
Jonathan Leffler

คำตอบ:


116

เพียงเพื่อเพิ่มคำตอบอื่น

: > filename

: เป็น no-op ใน bash (ตามมาตรฐาน POSIX) ดังนั้นโดยพื้นฐานแล้วจะเป็นการเปิดไฟล์เพื่อเขียน (ซึ่งแน่นอนว่าจะตัดทอนไฟล์) จากนั้นปิดทันที

แก้ไข: ตามที่เชลล์แสดงความคิดเห็นคุณไม่จำเป็นต้องมีคำสั่งเพื่อไปพร้อมกับการเปลี่ยนเส้นทาง:

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

การเปลี่ยนเส้นทางที่เรียบง่ายทั้งหมดด้วยตัวเองจะล้างไฟล์


25
หรือเพียงแค่> filename(ฉันแน่ใจว่าคุณรู้) โชคดีทุกคน.
shellter

5
@shelter "$> file" ไม่ใช่ POSIX และไม่พกพา คุณควรใช้คำสั่ง no-op ก่อนเปลี่ยนเส้นทางตามที่แนะนำในตอนแรก
Aaron Toponce

2
+ บวกสำหรับหน้ายิ้ม
Chris Suszyński

2
ดังที่ @AaronToponce ชี้ให้เห็นว่า "$> file" ไม่สามารถพกพาได้ ในการตั้งค่า Zsh ของฉันมันทำให้เชลล์ค้าง (ควรรอการป้อนข้อมูล) "$:> file" ทำงานใน Zsh ได้ดี
Linus Arver

1
@TechEnthusiast ขึ้นอยู่กับความคาดหวังของคุณ การตัดทอนนั้นเป็นอะตอม แต่คุณไม่รู้จริงๆว่าจะเกิดขึ้นเมื่อใดเมื่อเทียบกับการเขียนใด ๆ ตัวอย่างเช่นคุณสามารถปิดท้ายด้วยบรรทัดบางส่วนที่จุดเริ่มต้นของไฟล์
chepner

66

ฉันใช้คำสั่งต่อไปนี้กับเดเบียน

truncate -s 0 filename

@SteveClay: sudo sh -c ': > filename'จะตัดทอนด้วยfilename
Perleone

2
@SteveClay คำแนะนำ OPs ยังทำงานได้อย่างไม่มีที่ติกับsudo: sudo cp /dev/null filename. นอกจากนี้ยังcpพกพาได้ในขณะที่truncateเป็น Linux ที่ทันสมัยเท่านั้น
Tino

11

นั่นดูสมเหตุสมผลสำหรับฉัน แน่นอนว่า Unix จะให้คุณทำสิ่งนี้ได้ประมาณ 50 วิธี ตัวอย่างเช่น,

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

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