ทำให้เนื้อหาของไฟล์ว่างเปล่า


220

ฉันตระหนักถึงสามวิธีในการลบรายการทั้งหมดจากไฟล์

พวกเขาคือ

  • >filename
  • touch filename
  • filename < /dev/null

ในสามคนนี้ฉันใช้ความรุนแรง>filenameมากที่สุดเนื่องจากต้องใช้การกดแป้นน้อยที่สุด

อย่างไรก็ตามฉันต้องการทราบว่าวิธีใดที่มีประสิทธิภาพมากที่สุดในสาม (หากมีวิธีที่มีประสิทธิภาพมากกว่านี้) สำหรับไฟล์บันทึกขนาดใหญ่และไฟล์ขนาดเล็ก

นอกจากนี้สามรหัสทำงานและลบเนื้อหาอย่างไร


24
เกี่ยวกับtruncate -s 0 filenameอะไร
Martin Thoma

คล้ายกันมากกับความแตกต่างระหว่าง cat และ '>' เพื่อลบไฟล์ที่คุณจะพบข้อมูลเพิ่มเติม
Stéphane Chazelas

เป็นครั้งแรกที่จะทำงานเฉพาะในกรณีที่เรียกว่าจากบรรทัดคำสั่งทุบตี แต่จะไม่ทำงานหากดำเนินการในรูปแบบไฟล์ .sh
มาร์โก Marsala

8
touch ไม่ได้ลบเนื้อหา แต่เปลี่ยนเวลาในการเข้าถึงไฟล์ มันจะสร้างไฟล์ว่างเปล่าหากไม่มีอยู่
hbogert

คำตอบ:


293

ที่จริงแล้วรูปแบบที่สองtouch filenameไม่ได้ลบสิ่งใดจากไฟล์ - เพียงสร้างไฟล์ว่างเปล่าหากไม่มีอยู่หรืออัปเดตวันที่แก้ไขล่าสุดของไฟล์ที่มีอยู่

และที่สามfilename < /dev/nullพยายามเรียกใช้ชื่อไฟล์ด้วย/dev/nullอินพุต

cp /dev/null filename โรงงาน

ส่วนเรื่องประสิทธิภาพนั้นมีประสิทธิภาพมากที่สุดtruncate -s 0 filenameคือ ดูที่นี่: http://linux.die.net/man/1/truncate

มิฉะนั้นcp /dev/null filenameหรือ> filenameทั้งคู่ก็ดี ทั้งคู่เปิดและปิดไฟล์โดยใช้การตั้งค่าตัดทอนเมื่อเปิด cpยังเปิด/dev/nullเพื่อทำให้ช้าลงเล็กน้อย

ในทางกลับกันtruncateน่าจะช้ากว่า> filenameเมื่อเรียกใช้จากสคริปต์เนื่องจากการรันคำสั่ง truncate ต้องการให้ระบบเปิดไฟล์เรียกทำงานโหลดและเรียกใช้


9
แล้วทำไมคุณถึงพูดว่าtruncateมันมีประสิทธิภาพมากที่สุด?
Stéphane Chazelas

7
การดำเนินการ truncate ใช้การเรียกระบบ ftruncate () หรือ truncate () ซึ่งไม่รบกวนการเปิดไฟล์ นอกจากนี้ยังหลีกเลี่ยงการเรียกระบบ close () ที่ cp และ> filenameเมธอดจำเป็นต้องเรียกใช้
เถ้า

3
ที่จริงแล้วมัน (อย่างน้อย GNU หนึ่ง) เปิด + ftruncate + ปิด (นอกเหนือจากการเรียกใช้ระบบจำนวนมากเพื่อทำการโหลดและเริ่มต้นเอง) อย่างไรก็ตามมันจะต้องสร้างไฟล์หากไม่มีอยู่ และtruncate(2)ไม่ทำอย่างนั้น
Stéphane Chazelas

ถ้าเราใช้touch filenameไอโหนดจะยังคงเหมือนเดิม (หากมีไฟล์มาก่อน)?
pMan

1
@pMan ใช่คุณสามารถลองและตรวจสอบกับls -i
terdon


3

มีคำสั่ง builtin ":" ซึ่งมีอยู่ใน sh, csh, bash และอื่น ๆ ซึ่งอาจใช้งานได้ง่ายกับตัวดำเนินการส่งออกที่เปลี่ยนเส้นทาง>ตัดไฟล์:

#!/usr/bin/env bash
:> filename

สิ่งที่ฉันชอบคือไม่ต้องการคำสั่งภายนอกเช่น "echo" เป็นต้น

ข้อดีอย่างหนึ่งของการตัดทอนไฟล์แทนการลบ / สร้างใหม่ก็คือแอปพลิเคชั่นที่ทำงานกับไฟล์นี้ (เช่นมีคนทำtail -f filenameหรือเป็นซอฟต์แวร์ตรวจสอบ ... ) ไม่จำเป็นต้องเปิดใหม่อีกครั้ง พวกเขาสามารถใช้ไฟล์ filscriptor ต่อไปและรับข้อมูลใหม่ทั้งหมด


man bashอธิบายถึง:เชลล์ builtin ว่าไม่มีผลกระทบ
Haxiel

ใช่และคุณเปลี่ยนเส้นทางนี้>ไปยังไฟล์ซึ่งจะสร้างไฟล์หากไม่มีอยู่และหากมีอยู่คุณจะตัดทอนให้เป็นศูนย์ ดีกว่ากล่าวว่า: คุณใช้สิ่ง:ที่ไม่ทำอะไรเลยและใช้>เพื่อเปลี่ยนเส้นทางสิ่งใดไปยังไฟล์และตัดทอนมัน
Mirko Steiner

1
ทำไมคุณจะทำเช่นนั้น? > fileก็เพียงพอที่จะตัดทอนไฟล์ คุณไม่ต้องการคำสั่งใด ๆ เพียงตัวดำเนินการเปลี่ยนเส้นทาง
terdon

1
บางครั้ง > filenameจะไม่ทำงาน ตัวอย่างเช่นใน zsh แต่: > filenameยังคงทำงาน
CS Pei

Bash และ sh ดูเหมือนว่าจะชอบ> myfileแต่เช่นข้อผิดพลาด csh กับ: คำสั่ง null ไม่ถูกต้อง
Mirko Steiner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.