ฉันมีไฟล์ข้อความในโฮมไดเร็กตอรี่ของฉันซึ่งรับข้อมูลเป็นประจำผ่านงาน cron เนื่องจากงาน cron ให้ข้อมูลแบบไดนามิกฉันจึงต้องการตั้งค่างาน cron เพื่อล้างเนื้อหาไฟล์ (ไฟล์ยังคงมีอยู่) ฉันไม่ต้องการความช่วยเหลือ cron เพียงคำสั่งที่สามารถช่วยในการล้างไฟล์
ฉันมีไฟล์ข้อความในโฮมไดเร็กตอรี่ของฉันซึ่งรับข้อมูลเป็นประจำผ่านงาน cron เนื่องจากงาน cron ให้ข้อมูลแบบไดนามิกฉันจึงต้องการตั้งค่างาน cron เพื่อล้างเนื้อหาไฟล์ (ไฟล์ยังคงมีอยู่) ฉันไม่ต้องการความช่วยเหลือ cron เพียงคำสั่งที่สามารถช่วยในการล้างไฟล์
คำตอบ:
วิธีที่ง่ายที่สุด:
> filename
นี่เป็นวิธีที่เห็นได้ชัดน้อยกว่าและอาจทำให้ผู้อื่นอ่านสคริปต์เชลล์ได้น้อยลง แต่ทุกอย่างที่คุณต้องการ
เนื่องจาก>
ไม่ใช่คำสั่งจริง ๆ (เป็น bash builtin) คุณไม่สามารถใช้:
sudo > filename
เมื่อคุณไม่มีสิทธิ์ในไฟล์นั้น แต่คุณสามารถใช้:
sudo bash -c "> filename"
sudo crontab -e
เพื่อเพิ่มงาน cron สำหรับรูทไม่ใช่สำหรับคุณ หรือเปลี่ยนสิทธิ์ในแฟ้มไป 766 (หรือ 666) ไม่ sudo chmod 766 filename
755: เพิ่มเติมเกี่ยวกับ: codex.wordpress.org/Changing_File_Permissions
truncate filename
มีความสะอาดเป็นเล็ก ๆ น้อย ๆ sudo
และง่ายกว่าเปลี่ยนเส้นทางออกที่ว่างเปล่าเพื่อไฟล์และไม่ได้ทำงานเป็นปัญหาที่มี
truncate -s 0 filename
แน่นอนสามารถทำให้เคล็ดลับ คุณสามารถเพิ่มมันเป็นคำตอบ
มีเครื่องมือที่สร้างขึ้นเพื่อวัตถุประสงค์ดังกล่าว:
truncate -s 0 filename
สิ่งนี้จะล้างเนื้อหา แต่จะยังคงเป็นไฟล์เดียวกัน ( inodeยังคงเหมือนเดิม)
สิ่งนี้มีความสำคัญเนื่องจากบางโปรแกรมมีตัวจัดการไฟล์ "โดย inode" สมมติว่าคุณ "ว่าง" ไฟล์โดยใช้วิธีการไร้เดียงสาของการลบและสร้างไฟล์ใหม่ บางโปรแกรมอาจจะยังคงถือจับไปยังแฟ้มเก่า (ที่มีเนื้อหาเก่า) ls
แม้ว่าจะไม่สามารถมองเห็นวิธีการต่อตามปกติเช่น
ลิงก์บางอันไปยังรายละเอียดเพิ่มเติมในตอนท้ายของคำตอบนี้
วิธีอื่นอาจจำง่ายกว่า:
echo -n > filename
สิ่งนี้ยังคงไอโหนดเดียวกัน
โปรดทราบว่าทั้งสองtruncate
และecho -n
ยังไม่ได้กำหนดโดยPOSIX
สำหรับ POSIX ให้ใช้cat /dev/null
:
cat /dev/null > filename
อีกวิธีหนึ่งคลุมเครือมากขึ้นและอาจไม่ใช่ผู้ไม่เชื่อเรื่องพระเจ้า:
> filename
หากไฟล์ที่จะตัดทอนต้องมีสิทธิ์รูทในการเขียนดังนั้นบรรทัดต่อไปนี้จะไม่ทำงานอย่างที่คาดไว้:
sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename
นี่เป็นเพราะเชลล์ทำการเปลี่ยนเส้นทางโดยเชลล์ก่อนที่ sudo จะถูกเรียกใช้งาน นั่นหมายความว่าการเข้าถึงการเขียนไฟล์ทำได้โดยใช้สิทธิ์ของผู้ใช้ที่รันเชลล์ไม่ใช่สิทธิ์ที่จะได้รับจาก sudo
วิธีแก้ไขคือเลื่อนการเปลี่ยนเส้นทางไปยังเชลล์ที่ดำเนินการโดยใช้สิทธิ์ sudo ดังนี้:
sudo sh -c "echo -n > filename"
การใช้truncate
คุณไม่จำเป็นต้องมีวิธีแก้ปัญหาเช่นนี้เนื่องจากเชลล์ไม่ได้ทำการเข้าถึงการเขียนโดยเชลล์truncate
ดำเนินการโดย sudo โดยใช้สิทธิ์ sudo
sudo truncate -s 0 filename
สำหรับรายละเอียดเต็มไปด้วยเลือดเกี่ยวกับโปรแกรมที่เปิดไฟล์ไว้แม้ว่าไฟล์นั้นจะถูกลบไปแล้วก็ตาม
เพื่อให้สิ่งนี้เป็นแบบอัตโนมัติคุณสามารถใช้ logrotate เพียงแค่สร้างไฟล์กำหนดค่าสำหรับไฟล์ที่คุณต้องการลบเพิ่มการตั้งค่าอื่น ๆ และคุณสามารถทำให้มันว่างเปล่าทุกวันโดยอัตโนมัติตามเกณฑ์ที่คุณเลือก fe ทุกวันหรือเมื่อไฟล์มีขนาดใหญ่กว่า ฯลฯ
ดูที่นี่เกี่ยวกับวิธีกำหนดค่า logrotate: http://linuxcommand.org/man_pages/logrotate8.html
echo "" > foo_file
เป็นวิธีง่ายๆในการทำเช่นนั้นมันจะแทนที่เนื้อหาทั้งหมดของfoo_fileด้วย"" ซึ่งทำให้เป็นกรณีนี้ว่างเปล่า
นอกจากนี้คุณยังสามารถใช้cat /dev/null > foo_file
ที่จะอ่านอุปกรณ์โมฆะและเขียนทับไฟล์ของคุณไม่มีอะไรเลย
tail -n +1000 file.txt > file.txt
ควรลบ 1,000 บรรทัดและเก็บบรรทัดใหม่ล่าสุดไว้ในไฟล์ (คุณไม่มีทางรู้ว่าคุณอาจต้องมีระเบียนล่าสุดเพื่อติดตามบางอย่าง)