วิธีผนวกเอาต์พุตไปที่ท้ายไฟล์ข้อความ


478

ฉันจะผนวกเอาต์พุตของคำสั่งต่อท้ายไฟล์ข้อความได้อย่างไร?

คำตอบ:


665

ใช้>>แทน>เมื่อนำเอาต์พุตไปยังไฟล์:

your_command >> file_to_append_to

หากfile_to_append_toไม่มีอยู่มันจะถูกสร้างขึ้น

ตัวอย่าง:

$ echo "hello" > file
$ echo "world" >> file
$ cat file 
hello
world

4
ปัญหาคือการechoลบบรรทัดใหม่จากสตริง คุณจะต่อท้ายสตริงไฟล์ที่มีการขึ้นบรรทัดใหม่ได้อย่างไร?
Timothy Swan

5
@ TimothySwan ฉันเชื่อว่ามีตัวเลือก -e
Valentin Grégoire

echo ไม่ลบบรรทัดใหม่ออกจากสตริง หากคุณไม่สามารถอ้างอาร์กิวเมนต์ได้อย่างถูกต้องเชลล์จะแบ่งสตริงและส่งผ่านอาร์กิวเมนต์ไปยัง echo และ echo จะไม่เห็นบรรทัดใหม่
วิลเลียม Pursell

106

เพื่อappendใช้ไฟล์ >>

echo "hello world"  >> read.txt   
cat read.txt     
echo "hello siva" >> read.txt   
cat read.txt

ดังนั้นผลลัพธ์ควรเป็น

hello world   # from 1st echo command
hello world   # from 2nd echo command
hello siva

เพื่อoverwriteใช้ไฟล์ >

echo "hello tom" > read.txt
cat read.txt  

จากนั้นนำออกมาคือ

hello tom


74

คุณสามารถใช้โอเปอเรเตอร์ >> นี้จะผนวกข้อมูลจากคำสั่งไปยังจุดสิ้นสุดของไฟล์ข้อความ

ในการทดสอบให้ลองเรียกใช้:

echo "Hi this is a test" >> textfile.txt

ทำสองสามครั้งแล้วเรียกใช้:

cat textfile.txt

คุณจะเห็นข้อความของคุณต่อท้ายไฟล์ textfile.txt หลายครั้ง


40

ใช้command >> file_to_append_toเพื่อผนวกเข้ากับไฟล์

ตัวอย่างเช่น echo "Hello" >> testFile.txt

ข้อควรระวัง:ถ้าคุณใช้เพียงไฟล์เดียว>คุณจะเขียนทับเนื้อหาของไฟล์ เพื่อให้แน่ใจว่าไม่เคยเกิดขึ้นคุณสามารถเพิ่มที่คุณset -o noclobber.bashrc

วิธีนี้ช่วยให้มั่นใจได้ว่าหากคุณพิมพ์command > file_to_append_toไฟล์ที่มีอยู่โดยไม่ตั้งใจมันจะเตือนคุณว่าไฟล์นั้นมีอยู่แล้ว ข้อความแสดงข้อผิดพลาดตัวอย่าง:file exists: testFile.txt

ดังนั้นเมื่อคุณใช้>มันจะอนุญาตให้คุณสร้างไฟล์ใหม่เท่านั้นไม่เขียนทับไฟล์ที่มีอยู่



21

การใช้teeพร้อมตัวเลือก-a (- ผนวก)ช่วยให้คุณสามารถผนวกหลาย ๆ ไฟล์พร้อมกันและใช้sudo (มีประโยชน์มากเมื่อผนวกกับไฟล์ที่มีการป้องกัน) นอกจากนั้นมันเป็นเรื่องที่น่าสนใจหากคุณจำเป็นต้องใช้เชลล์อื่นนอกเหนือจาก bash เนื่องจากเชลล์บางตัวไม่รองรับตัวดำเนินการ> และ >>

echo "hello world" | sudo tee -a output.txt

กระทู้นี้มีคำตอบที่ดีเกี่ยวกับที


2
นี่เป็นวิธีที่ดีที่สุดในการต่อท้ายสิ่งใหม่ด้วยบรรทัดใหม่
M_R_K

2
กำลังมองหาวิธีที่จะผนวกเข้ากับไฟล์ที่มีการป้องกันและสิ่งนี้จะแก้ไขได้
Woootiness

14

สำหรับคำถามทั้งหมด:

cmd >> o.txt && [[ $(wc -l <o.txt) -eq 720 ]] && mv o.txt $(date +%F).o.txt

สิ่งนี้จะผนวก 720 บรรทัด (30 * 24) ลงใน o.txt และหลังจากนั้นจะเปลี่ยนชื่อไฟล์ตามวันที่ปัจจุบัน

เรียกใช้ข้างต้นด้วย cron ทุกชั่วโมงหรือ

while :
do
    cmd >> o.txt && [[ $(wc -l <o.txt) -eq 720 ]] && mv o.txt $(date +%F).o.txt
    sleep 3600
done

11

ฉันจะใช้ printf แทน echo เพราะมีความน่าเชื่อถือมากกว่าและกระบวนการจัดรูปแบบเช่นบรรทัดใหม่\nอย่างถูกต้อง

ตัวอย่างนี้สร้างเอาต์พุตคล้ายกับ echo ในตัวอย่างก่อนหน้านี้:

printf "hello world"  >> read.txt   
cat read.txt
hello world

อย่างไรก็ตามหากคุณต้องแทนที่ printf ด้วย echo ในตัวอย่างนี้ echo จะถือว่า \ n เป็นสตริงดังนั้นจึงไม่สนใจเจตนา

printf "hello\nworld"  >> read.txt   
cat read.txt
hello
world

7

ฉันขอแนะนำให้คุณทำสองสิ่ง:

  1. ใช้>>ในเชลล์สคริปต์ของคุณเพื่อผนวกเนื้อหาไปยังไฟล์เฉพาะ ชื่อไฟล์สามารถแก้ไขได้หรือใช้รูปแบบบางอย่าง
  2. ตั้งค่า cronjob รายชั่วโมงเพื่อเรียกเชลล์สคริปต์

7

ตัวอย่างเช่นไฟล์ของคุณมี:

 1.  mangesh@001:~$ cat output.txt
    1
    2
    EOF

ถ้าคุณต้องการต่อท้ายไฟล์แล้ว ----> จำช่องว่างระหว่าง 'text' >> 'filename'

  2. mangesh@001:~$ echo somthing to append >> output.txt|cat output.txt 
    1
    2
    EOF
    somthing to append

และเพื่อเขียนทับเนื้อหาของไฟล์:

  3.  mangesh@001:~$ echo 'somthing new to write' > output.tx|cat output.tx
    somthing new to write

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