วิธีการว่าง ("ตัดทอน") ไฟล์บน linux ที่มีอยู่แล้วและได้รับการป้องกันใน Someway?


113

ฉันมีไฟล์ชื่อ error.log บนเซิร์ฟเวอร์ของฉันซึ่งฉันจำเป็นต้องตัดทอนบ่อยๆ ฉันมีสิทธิ์ rw สำหรับไฟล์ การเปิดไฟล์ใน vi> การลบเนื้อหาทั้งหมด> การบันทึกงาน (ชัดเจน) แต่พอลองดูด้านล่าง

cat /dev/null > error.log

ฉันได้รับข้อความ

File already exists.

เห็นได้ชัดว่ามีการกำหนดค่าบางอย่างบนเซิร์ฟเวอร์เพื่อป้องกันการลบล้างไฟล์โดยไม่ได้ตั้งใจ ใครสามารถบอกได้ว่าฉันจะ "ตัดทอน" ไฟล์ด้วยคำสั่งเดียวได้อย่างไร


2
สำหรับไฟล์ที่ไม่มีการป้องกันไฟล์ truncate -s 0 จะใช้งานได้
ประมวล

คำตอบ:


158

คุณมีnoclobberชุดตัวเลือก ข้อผิดพลาดดูเหมือนว่ามาจาก csh ดังนั้นคุณต้องทำ:

cat /dev/null >! file

ถ้าฉันผิดและคุณใช้ทุบตีคุณควรทำ:

cat /dev/null >| file

ในการทุบตีคุณสามารถย่อให้สั้นลงเป็น:

>| file

คุณพูดถูกเกี่ยวกับเชลล์ที่เป็น csh คุณรู้ได้ยังไง?
Sumeet Pareek

6
@ Wikidkaka - ขึ้นอยู่กับข้อความแสดงข้อผิดพลาด csh บนระบบของฉันให้File existsข้อผิดพลาดที่คล้ายกันในขณะที่ bash ให้cannot overwrite existing fileข้อผิดพลาดที่แตกต่างกันมาก
R Samuel Klatchko

6
@Jarmund - เนื่องจากผู้ใช้ตั้งค่า noclobber >fileจึงไม่ทำงาน
R Samuel Klatchko

อะไรคือความแตกต่างระหว่าง> fileและ>| file?
จะ

1
@ จะ - หากคุณnoclobberตั้งค่าตัวเลือกการพยายามเปลี่ยนเส้นทางไปยังไฟล์ที่มีอยู่ล้มเหลว หากต้องการลบล้างการเปลี่ยนเส้นทางที่เฉพาะเจาะจงขณะที่เปิด noclobber ไว้คุณสามารถใช้>|
R Samuel Klatchko

71

คุณยังสามารถใช้ฟังก์ชันตัดทอน

$truncate -s0 yourfile

หากการอนุญาตถูกปฏิเสธให้ใช้ sudo

$sudo truncate -s0 yourfile

วิธีใช้ / คู่มือ: คนตัดทอน

ทดสอบบน ubuntu Linux


1
การตัดทอนยังสัมผัสกับเวลาแก้ไขของไฟล์ - ในขณะที่ "> ไฟล์" จะไม่สัมผัสหากไฟล์ไม่มีการเปลี่ยนแปลง
dsteinkopf

มันไม่ปล่อยเนื้อที่ดิสก์ที่ไฟล์เก็บไว้ ในตอนแรกจะแสดง 0 ไบต์ แต่เมื่อคุณเขียนบางอย่างลงในไฟล์นั้นขนาดไฟล์จะเป็น = ก่อนที่จะตัดทอน + ขนาดข้อมูลใหม่
Aniket Kulkarni

48

แค่นี้ก็เพียงพอแล้วที่จะตั้งขนาดไฟล์เป็น 0:

> error.log

6
อันที่จริงสิ่งนี้ใช้ไม่ได้กับ noclobber (ทดสอบด้วยตัวเอง) ดังนั้นจึงไม่ใช่วิธีแก้ปัญหาที่ถูกต้องในกรณีนี้ ("-bash: error.log: ไม่สามารถเขียนทับไฟล์ที่มีอยู่"); ดูชมเชยด้านบน ("@Jarmund - เนื่องจากผู้ใช้ตั้งค่า noclobber> ไฟล์ไม่ทำงาน") ฉันแค่สงสัยว่า "คนฉลาด" ประเภทไหน

9

เครดิตไปสำหรับเพื่อนร่วมงานอาวุโสของฉันสำหรับสิ่งนี้:

:> filename

สิ่งนี้จะไม่ทำลายไฟล์บันทึกดังนั้นคุณสามารถใช้กับ syslog ได้เช่นกัน


8
กรุณาอธิบาย. มันทำงานอย่างไร? สัญกรณ์นั้นกำลังทำอะไรอยู่?
user31986

2
@ user31986 :เป็นคำสั่งที่ไม่มีเอฟเฟกต์ (เกือบจะเป็นความคิดเห็น) จากนั้น>เป็นการเปลี่ยนทิศทางตามปกติดังนั้นสิ่งนี้จะเปลี่ยนเส้นทางการขาดเอาต์พุตจากคำสั่งที่ไม่ได้ทำอะไรเลยในไฟล์ หากเปิดใช้งาน noclobber คุณต้อง:>| filename(bash) (และฉันคิดว่า:>! filenameใน csh สมมติว่า csh มี:)
Rhubbarb

4

เท็จ | tee fileToTruncate

อาจใช้งานได้เช่นกัน


นั่นเป็นเรื่องโง่ หรือถ้าสิ่งนี้มีประโยชน์การได้รับddเอาต์พุตอย่างคลุมเครือจะไม่มีอะไรดีไปกว่าการอ่านธรรมดาfalse?
tripleee

2

เนื่องจาก sudo จะไม่ทำงานกับการเปลี่ยนเส้นทาง >ฉันจึงชอบteeคำสั่งสำหรับจุดประสงค์นี้

echo "" | sudo tee fileName

ดีจริงตามที่อธิบายไว้ทั้งในคำถามที่คุณเชื่อมโยงและที่นี่ด้านบน "sudo sh -c '> error.log'" ...

ขึ้นอยู่กับสิทธิ์ในไฟล์เป้าหมายerror.logหากสามารถเขียนได้แล้วก็ไม่จำเป็นต้อง sudo ฉันคิดว่าปัญหาอื่น ๆ คือคุณกำลังส่งคำสั่งเป็นอาร์กิวเมนต์สตริงไปshฉันไม่รู้ว่ามีการจัดการภายในอย่างไร แต่นั่นคืออีกชั้นของความซับซ้อน / การเปลี่ยนเส้นทางที่เพิ่มเข้ามา
sakhunzai

1
สิ่งนี้จะไม่ตัดทอนไฟล์เพราะecho ""จะเพิ่มขึ้นบรรทัดใหม่ คุณสามารถใช้echo -n ""เพื่อระงับการขึ้นบรรทัดใหม่
Seb

0

ใครก็ได้ลองใช้คำสั่งนี้เพื่อตัดทอนไฟล์ใด ๆ ในระบบ linux

สิ่งนี้จะทำงานในรูปแบบใดก็ได้:

truncate -s 0 file.txt


-4

คุณสามารถลอง:

echo -n > /my/file


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