วิธีการล้างเนื้อหาของไฟล์จากบรรทัดคำสั่ง?


280

ฉันมีไฟล์บันทึกที่มีเนื้อหามากมายที่ฉันไม่ต้องการอีกต่อไป ฉันต้องการล้างเนื้อหา

ฉันรู้วิธีพิมพ์เนื้อหาไปที่หน้าจอ:

cat file.log

ฉันรู้วิธีแก้ไขไฟล์ทีละบรรทัด:

nano file.log

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

คำตอบ:


465

ในทุบตีเพียง

> filename

จะทำ.

นี้จะทำให้คุณมีไฟล์ที่ว่างเปล่าชื่อไฟล์

PS

หากคุณจำเป็นต้องsudoเรียกโปรดพิจารณาที่จะใช้truncateเป็นคำตอบที่นี่


57
นี่อาจเป็นคำสั่ง raddest ที่สุดในประวัติศาสตร์ของการคำนวณ
blarg

7
ตรงกันข้าม @ Arekkusandaa.Irujasukin; มันทำงานได้ดีใน Windows ทุกรุ่นตราบใดที่คุณใช้bashเป็นเชลล์และไม่ใช่เช่นcmd.exeหรือ PowerShell ซึ่ง POSIXy ไม่เพียงพอที่จะรองรับสิ่งเหล่านี้
DopeGhoti

124

คุณสามารถใช้คำสั่งผู้ใช้: truncate

truncate -s 0 test.txt

("-s 0" เพื่อระบุขนาด)

http://www.commandlinefu.com/commands/view/12/empty-a-file


3
คำตอบที่ดีที่สุดทำงานเมื่อคุณไม่รูท (ด้วย sudo) - sudo echo > fileเพียงแค่ให้ข้อผิดพลาดในกรณีเช่น
Dmitry Verkhoturov

12
@DmitryVerkhoturov: sudo bash -c '> filename'เป็นวิธีที่คุณใช้โซลูชัน Bash ด้วย sudo
Stuart P. Bentley

1
brew install truncateบน os x พร้อมกับติดตั้ง homebrew
xaxxon

ทำงานได้เร็วกว่าเสียงสะท้อน
Miao1007

34

คุณสามารถทำได้:

echo -n "" > file.log

การใช้>เพื่อเขียนอินพุต (null) จากecho -nไปยังไฟล์

การใช้>>จะผนวกการป้อนข้อมูล null ไปยังแฟ้ม (อย่างมีประสิทธิภาพทำอะไร แต่touchไอเอ็นจีได้)


นี่จะเว้นที่ว่างไว้
dmckee

ฉันได้รับสิ่งนี้: -bash:: ไม่พบคำสั่ง
Andrew

3
echo ""> จะยังให้ไฟล์ที่มีอักขระหนึ่งตัว (ขึ้นบรรทัดใหม่) หากคุณต้องการใช้ echo ให้ใช้ "echo -n> file.log" เพื่อ echo null
Dave Forgac

มันจะเป็นการดีกว่าถ้าคุณใช้คำสั่ง null-output เฉพาะเช่นtrue(หรือนามแฝงภายใน:) ถึงแม้ว่าท้ายที่สุดคุณจะไม่ต้องการคำสั่งเลย (ดูคำตอบที่ยอมรับ)
Stuart P. Bentley

sudoคุณอาจมีปัญหาบางอย่างกับ
ขนมแป้งจี่

27
: > file.log

เช่นเดียวกับ> filenameในทุบตี แต่ผลงานในเปลือกหอยอื่น ๆ(เครดิต) การเปลี่ยนเส้นทางการส่งออกจากtruebuiltin (ซึ่งมีการส่งออกไม่ได้) filenameที่จะ


ฉันมาเพื่อตอบคำถามนี้ แต่มันก็อยู่ที่นี่แล้ว ...
Aaron Hall

5
:> filenameเพียงแค่ทำ มันดูไม่เหมือนยิ้มหรือไม่? :>
minmaxavg

10

ZSH

>! filename

ZSH จะปกป้องผู้ใช้จากไฟล์ clobbering >ใช้ประกอบการ หากคุณใช้>!คุณสามารถบังคับให้ตัดทอนไฟล์ที่มีอยู่

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

ข้อมูลเพิ่มเติม: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

หากคุณต้องการทำจากในโปรแกรมแก้ไขเป็นกลุ่มในบรรทัดคำสั่งคุณสามารถลองนี้:

vim file.txt 

Escกด

:1,$d

Enterกด

คุณจะพบการลบทุกบรรทัด


นี่เป็นสิ่งเดียวที่ใช้งานได้สำหรับฉันmaillogแม้sudo > /var/log/maillogจะไม่ชัดเจน (ปฏิเสธสิทธิ์)
bobobobo

2
@bobobobo มันไม่ทำงานตามsudo > /var/log/maillogวิธี - เรียกใช้ sudo และใส่ผลลัพธ์ลงในไฟล์ เห็นได้ชัดว่ามันจะเอาท์พุทที่มีสิทธิ์ผู้ใช้ปัจจุบัน สิ่งที่ง่ายขึ้นทำจะเริ่มต้นเปลือกรากแล้วทำsudo su > /var/log/maillog
กาญจน์

4
$ rm file.log; touch file.log

หรือ

$ cat > file.log

control-dตามมาด้วย

หรือ ... หรือ ... หรือ ...

อา นี่เป็นเวอร์ชั่นคำสั่งเดียว:

$ dd if=/dev/null of=file.log

2
คำแนะนำของ Thechickenmoo echo "" > file.logนั้นดีกว่าcatตัวเลือกที่คุณแสดงในสถานการณ์นี้มีคนอื่นที่catเหมาะสมกว่า ทั้งสองใช้การเปลี่ยนเส้นทางเชลล์เดียวกันเพื่อทำการยกของหนัก
ต้มตุ๋น quixote

2
คุณไม่จำเป็นต้องเรียกใช้คำสั่ง cat เพียงแค่ "> file.log" จะทำ
camh

การลบไฟล์จะรีเซ็ตวันที่สร้าง
Matteo

การลบไฟล์จะทำให้โปรแกรมที่รับชมไฟล์นั้นสูญเสียตัวชี้ไป (เช่นจะมีที่อยู่ใหม่ในระบบไฟล์) โดยทั่วไปแล้วใช่rmจะทำงานของการผลิตไฟล์ว่างเปล่าที่มีชื่อเดียวกัน แต่มันจะไม่ถูกต้องสำหรับทุกกรณีการใช้งาน
เบิร์ต


2

หากคุณต้องการใช้สิทธิ์ sudo เป็นสิทธิ์ superuser เพื่อเข้าถึงไฟล์คำตอบที่ยอมรับจะไม่ทำงาน ใช้สิ่งนี้ทำงาน:

truncate -s0 file

หรืออย่างชัดเจนด้วย sudo:

sudo truncate -s0 file

ข้อมูลเพิ่มเติมที่นี่http://www.commandlinefu.com/commands/view/12/empty-a-file



1

หากคุณมีช่องว่างในชื่อไฟล์ให้ใช้:

for file in /path/to/file/*; do > "$file"; done

(ฉันไม่สามารถรวมไว้ในความคิดเห็นต่อคำตอบก่อนหน้านี้ได้เนื่องจากฉันไม่มีชื่อเสียง 50 ข้อบางครั้งข้อ จำกัด มีผลในทางตรงกันข้าม)


0

ทีละบรรทัด?

ลองใช้ vi (m) โปรแกรมแก้ไขข้อความน่ารักที่สามารถทำอะไรได้บ้าง ในกรณีนี้นำทางไปยังบรรทัดกด d (เพื่อลบ) และ d อีกครั้ง (สำหรับบรรทัด)


5
หากคุณต้องการกำจัดไฟล์ทั้งหมดในกลุ่มด้วยเคอร์เซอร์ที่ด้านบนของเอกสารให้พิมพ์ d G (นั่นคือ d จากนั้น shift-G) จะลบไฟล์ทั้งหมด (สำหรับการลบ G สำหรับการสิ้นสุด ไฟล์). ฉันชอบวิธีการของคุณมากกว่า (มันให้เวลากับฉันมากกว่าที่จะคิดหรือไม่ว่าฉันต้องการขยะไฟล์จริงๆ)
Babu

@Babu ย้ายไปด้านบนเพื่อให้ลำดับทั้งหมดอาจจะเป็นgg ggdG
Bob


0

นอกจากนี้หากคุณมีหลายไฟล์คุณสามารถใช้สิ่งต่อไปนี้:

for file in /path/to/file/*; do > $file; done

สิ่งนี้มีประโยชน์สำหรับไฟล์บันทึกในไดเรกทอรีเดียวกัน


0

> a.txt

เหมือนกับ> ชื่อไฟล์ใน Bash แต่ทำงานในเชลล์มากกว่านี้ (เครดิต) เปลี่ยนทิศทางเอาต์พุตจาก builtin จริง (ซึ่งไม่มีเอาต์พุต) เป็นชื่อไฟล์

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