ฉันจะต่อท้ายข้อความในไฟล์ได้อย่างไร?


109

วิธีที่ง่ายที่สุดในการต่อท้ายข้อความเข้ากับไฟล์ใน Linux คืออะไร?

ฉันได้ดูคำถามนี้แล้ว แต่คำตอบที่ยอมรับนั้นใช้โปรแกรมเพิ่มเติม ( sed) ฉันแน่ใจว่าควรมีวิธีที่ง่ายกว่าechoหรือคล้ายกัน

คำตอบ:


125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

โดยพื้นฐานแล้วคุณสามารถถ่ายโอนข้อความที่คุณต้องการลงในไฟล์ได้ CTRL-D ส่งสัญญาณ end-of-file ซึ่งจะยกเลิกอินพุตและส่งกลับคุณไปที่เชลล์


2
ฉันจะทำสิ่งนี้ได้อย่างไรเมื่อไฟล์ต้องการสิทธิ์การรูท
UselesssCat

2
@UselesssCat เมื่อมีบางอย่างเกิด "การอนุญาตถูกปฏิเสธ" ฉันจะตรวจสอบคำสั่งที่ฉันกำลังเรียกใช้อีกครั้งจากนั้นจึงใช้sudo !!- ซึ่งเรียกใช้คำสั่งสุดท้ายโดยมีการsudoต่อท้าย ฉันเพิ่งค้นพบว่าสิ่งนี้ใช้ได้กับnanoฯลฯ (โดยบังเอิญพยายามnano nano auth... )
Sandra

หากคุณจำเป็นต้องใช้ sudo หรือใช้สิ่งนี้ในสคริปต์โปรดดูการติดตามของฉันสำหรับคำตอบที่ยอมรับด้านล่างนี้
user12345

4
ไม่รู้แมวใช้แบบนี้ได้! เช่นเดียวกับการเขียนรายการบันทึกประจำวัน ยังไม่รู้เกี่ยวกับสิ่งที่ ctrl-d ทำ ขอบคุณ!
houallet

1
@ แซนดร้า - ไม่เคยใช้!!มาก่อนน่ากลัว บ่อยครั้งที่ฉันทำในสิ่งที่ชอบcat /var/log/apache/error.logและถูกปฏิเสธการอนุญาต นอกจากนี้ยังสามารถทำได้ด้วย id จาก history เช่นsudo !1419สิ่งนี้จะดำเนินการคำสั่งที่บรรทัด1419ในประวัติเป็น sudo
Cyclonecode

172

เกี่ยวกับ:

echo "hello" >> <filename>

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

คุณสามารถใช้printfในลักษณะเดียวกัน:

printf "hello" >> <filename>

โปรดทราบว่าการใช้ข้างต้นอาจเป็นอันตรายได้ ตัวอย่างเช่นหากคุณมีไฟล์อยู่แล้วและต้องการต่อท้ายข้อมูลที่ท้ายไฟล์และคุณลืมใส่ข้อมูลสุดท้าย>ทั้งหมดในไฟล์จะถูกทำลาย คุณสามารถเปลี่ยนพฤติกรรมนี้ได้โดยตั้งค่าnoclobberตัวแปรใน.bashrc:

set -o noclobber

ตอนนี้เมื่อคุณพยายามที่จะทำคุณจะได้รับการเตือนว่าecho "hello" > file.txtcannot overwrite existing file

ในการบังคับเขียนไฟล์ตอนนี้คุณต้องใช้ไวยากรณ์พิเศษ:

echo "hello" >| <filename>

คุณควรทราบด้วยว่าโดยค่าเริ่มต้นechoจะเพิ่มอักขระบรรทัดใหม่ต่อท้ายซึ่งสามารถระงับได้โดยใช้-nแฟล็ก:

echo -n "hello" >> <filename>

อ้างอิง


4
โดยทั่วไปแล้วฉันชอบคำตอบนี้มากกว่าคำตอบที่ยอมรับว่าใช้catแต่คุณควรระมัดระวังและใช้>>แทน>!
sixty4bit

@ sixty4bit - เห็นด้วยโดยสิ้นเชิง แต่ฉันคิดว่าคุณต้องรู้เสมอว่าคุณกำลังทำอะไรอยู่เมื่อทำงานกับเชลล์ไม่เช่นนั้นคุณอาจทำอะไรบางอย่างเช่นsudo rm -r /=)
Cyclonecode

1
ดีsudo rm -r /กว่าsudo rm -rf /! ^ _ ^ มีการตั้งค่าสถานะที่จะขอการยืนยันก่อนที่จะเขียนทับเนื้อหาของไฟล์ที่มีอยู่>หรือไม่? การใช้นามแฝงว่าเพื่อใช้ธงดังกล่าวเสมอดูเหมือนจะเป็นความคิดที่ดี
sixty4bit

2
@ sixty4bit - คุณสามารถเพิ่มset -o noclobberในของคุณ.bashrcแล้วคุณจะไม่สามารถเขียนทับไฟล์ที่มีอยู่โดยไม่ต้องใช้ไวยากรณ์พิเศษecho "hello" >| <filename>
Cyclonecode

คุณช่วยยกตัวอย่างที่เรียกไฟล์พูด "myFile.txt" หรืออะไรก็ได้ ฉันไม่แน่ใจว่าเป็น <ชื่อไฟล์> หรือชื่อไฟล์ในตัวอย่างของคุณ
bharal

24

วิธีอื่นที่เป็นไปได้คือ:

echo "text" | tee -a filename >/dev/null

-aจะผนวกในตอนท้ายของแฟ้ม

หากจำเป็นsudoให้ใช้:

echo "text" | sudo tee -a filename >/dev/null

ทำไมต้อง> / dev / null ในตอนท้าย
Quadrivium

1
>/dev/nullที่ป้องกันไม่ให้ท้าย "ข้อความ" ที่จะแสดงในคอนโซลของคุณ
user9869932

13

ติดตามเพื่อรับคำตอบที่ยอมรับ

คุณจำเป็นต้องมีสิ่งอื่นที่ไม่ใช่CTRL-D ที่จะกำหนดให้สิ้นสุดถ้าใช้ในสคริปต์ ลองสิ่งนี้แทน:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

การดำเนินการนี้จะต่อท้ายข้อความในไฟล์ที่ระบุ (ไม่รวม "EOF")

มันใช้ที่นี่เอกสาร (หรือ heredoc)

อย่างไรก็ตามหากคุณต้องการ sudo เพื่อต่อท้ายไฟล์ที่ระบุคุณจะประสบปัญหาในการใช้ heredoc เนื่องจากการเปลี่ยนเส้นทาง I / O หากคุณพิมพ์โดยตรงบนบรรทัดคำสั่ง

รูปแบบนี้จะทำงานเมื่อคุณพิมพ์โดยตรงบนบรรทัดคำสั่ง:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

หรือคุณสามารถใช้teeแทนเพื่อหลีกเลี่ยงปัญหา sudo บรรทัดคำสั่งที่พบเมื่อใช้ heredoc กับ cat:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF

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