ฉันมีสองไฟล์: และfile1
file2
ฉันจะผนวกเนื้อหาของfile2
เพื่อfile1
ให้เนื้อหาของfile1
กระบวนการยังคงอยู่ได้อย่างไร?
ฉันมีสองไฟล์: และfile1
file2
ฉันจะผนวกเนื้อหาของfile2
เพื่อfile1
ให้เนื้อหาของfile1
กระบวนการยังคงอยู่ได้อย่างไร?
คำตอบ:
ใช้การเปลี่ยนเส้นทาง bash ในตัว (tldp) :
cat file2 >> file1
sudo
กับcat
คำสั่ง (และป้อนข้อมูลประจำตัวหากมีการแจ้ง)
tee
โปรแกรม: cat 1 | tee -a 2 3
. คุณสามารถใส่ไฟล์ได้มากเท่าที่คุณต้องการหลังจากสวิตช์--append
(หรือ-a
สั้น ๆ )
cat file2 >> file1
>>
ประกอบการผนวกการส่งออกไปยังไฟล์ชื่อหรือสร้างไฟล์ชื่อถ้ามันไม่ได้อยู่
cat file1 file2 > file3
สิ่งนี้จะเชื่อมไฟล์สองไฟล์หรือมากกว่าเข้าด้วยกัน คุณสามารถมีไฟล์ต้นฉบับได้มากเท่าที่คุณต้องการ ตัวอย่างเช่น,
cat *.txt >> newfile.txt
อัปเดต 20130902
ในความคิดเห็น eumiro แนะนำ "อย่าลองcat file1 file2 > file1
" เหตุผลที่อาจไม่ส่งผลให้ผลลัพธ์ที่คาดหวังคือไฟล์ที่ได้รับการเปลี่ยนเส้นทางถูกจัดทำขึ้นก่อนที่คำสั่งทางด้านซ้ายของไฟล์>
จะถูกดำเนินการ ในกรณีนี้เป็นครั้งแรกที่file1
ถูกตัดทอนให้เป็นศูนย์ความยาวและเปิดสำหรับการส่งออกแล้วcat
พยายามคำสั่งเพื่อ concatenate ไฟล์ความยาวเป็นศูนย์ตอนนี้บวกกับเนื้อหาของเข้าfile2
file1
ผลที่ได้คือเนื้อหาต้นฉบับของfile1
สูญหายและในสถานที่คือสำเนาfile2
ซึ่งอาจไม่เป็นไปตามที่คาดไว้
ปรับปรุง 20160919
ในความคิดเห็น tpartee แนะนำการเชื่อมโยงไปยังการสำรองข้อมูล / แหล่งที่มา สำหรับการอ้างอิงที่มีสิทธิ์ฉันนำผู้อ่านที่ใจดีไปยังหน้า man shที่ linuxcommand.org ซึ่งระบุว่า:
ก่อนที่จะดำเนินการคำสั่งอินพุตและเอาต์พุตอาจถูกเปลี่ยนทิศทางโดยใช้สัญลักษณ์พิเศษที่ตีความโดยเชลล์
ในขณะที่จะบอกผู้อ่านสิ่งที่พวกเขาจำเป็นต้องรู้มันเป็นเรื่องง่ายที่จะพลาดถ้าคุณไม่ได้มองหามันและแยกคำคำต่อคำ คำที่สำคัญที่สุดที่นี่คือ 'ก่อน' การเปลี่ยนเส้นทางเสร็จสมบูรณ์ (หรือล้มเหลว) ก่อนที่คำสั่งจะถูกดำเนินการ
ในกรณีตัวอย่างของcat file1 file2 > file1
เชลล์ทำการเปลี่ยนทิศทางก่อนเพื่อให้มีการจัดการ I / O ในสภาพแวดล้อมที่คำสั่งจะถูกดำเนินการก่อนที่จะถูกดำเนินการ
เวอร์ชันที่เป็นมิตรกว่าที่ความสำคัญในการเปลี่ยนเส้นทางถูกครอบคลุมได้ที่เว็บไซต์ของ Ian Allen ในรูปแบบของบทเรียน Linux หน้าI / O Redirection Notes ของเขามีหลายสิ่งที่จะพูดในหัวข้อรวมถึงการสังเกตว่าการเปลี่ยนเส้นทางทำงานได้แม้ไม่มีคำสั่ง ผ่านสิ่งนี้ไปที่เปลือก:
$ >out
... สร้างไฟล์ว่างที่มีชื่อว่า เชลล์ตั้งค่าการเปลี่ยนเส้นทาง I / O ก่อนจากนั้นค้นหาคำสั่งค้นหาไม่พบและดำเนินการให้เสร็จสิ้น
cat file1 file2 > file1
- สิ่งนี้จะไม่ทำงานเหมือนที่คุณกำลังรออยู่
>>
ซึ่งจะfile1
แก้ไขไฟล์ T.Rob ทำงานที่เหนือกว่าอย่างมากในการอธิบายคำตอบของเขาแทนที่จะแข่งเพื่อส่งบางสิ่งที่เป็นจริงแล้วไม่ถูกต้อง จากข้อความของคำถามฉันเชื่อว่าcat file1 file2 > file3
เป็นคำสั่งที่เหมาะสมที่ @asir กำลังมองหา
>
ถูกดำเนินการก่อน ดังนั้นการเรียกใช้งานcat file1 file2 > file1
จะทำให้เกิดการอุดตันก่อนfile1
จากนั้นจึงพยายามคัดลอกไฟล์ที่มีความยาวเป็นศูนย์ตอนนี้ไปยังตัวมันเอง สิ่งนี้สมเหตุสมผลเมื่อคุณนึกถึงลำดับที่การดำเนินการอาจเกิดขึ้นและควรเกิดขึ้น แต่มีความละเอียดอ่อนพอที่จะทำให้คนจำนวนมากประหลาดใจ ดังนั้นหากไม่มีสิ่งใด eumiro และคุณได้รับแจ้งให้ปรับปรุงคำตอบต่อไป ขอบคุณสำหรับสิ่งนั้น!
>>
ผนวกเข้ากับไฟล์และ>
แทนที่ไฟล์
หมายเหตุ : หากคุณต้องการใช้sudoให้ทำสิ่งนี้:
sudo bash -c 'cat file2 >> file1'
วิธีการปกติของsudo
การต่อเติมคำสั่งเพียงอย่างเดียวจะล้มเหลวเนื่องจากการเพิ่มสิทธิ์ไม่ได้นำไปสู่การเปลี่ยนเส้นทางเอาต์พุต
cat file2 | sudo tee -a file1 > /dev/null
ลองคำสั่งนี้:
cat file2 >> file1
เพียงเพื่อการอ้างอิงการใช้ ddrescue แสดงวิธีการขัดจังหวะในการบรรลุภารกิจถ้าเช่นคุณมีไฟล์ขนาดใหญ่และจำเป็นต้องหยุดและจากนั้นดำเนินการต่อในภายหลัง:
ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile
logfile
เป็นบิตที่สำคัญ คุณสามารถขัดจังหวะกระบวนการด้วยCtrl-C
และดำเนินการต่อโดยการระบุคำสั่งเดียวกันที่แน่นอนอีกครั้งและ ddrescue จะอ่านlogfile
และดำเนินการต่อจากที่มันค้างไว้ -o A
ธงบอก ddrescue เริ่มต้นจากไบต์ในแฟ้มผลลัพธ์ ( ) ดังนั้นเพียงแยกขนาดเป็นไบต์ (คุณสามารถวางผลลัพธ์จากถ้าคุณต้องการ)file1
wc --bytes file1 | awk '{ print $1 }'
file1
ls
ตามที่ระบุโดยngksในความคิดเห็นข้อเสียคือ ddrescue จะไม่ถูกติดตั้งโดยค่าเริ่มต้นดังนั้นคุณจะต้องติดตั้งด้วยตนเอง ภาวะแทรกซ้อนอื่น ๆ คือว่ามีสองรุ่นของ ddrescue ซึ่งอาจอยู่ในที่เก็บของคุณ: ดูคำถาม askubuntu นี้สำหรับข้อมูลเพิ่มเติม รุ่นที่คุณต้องการคือ GNU ddrescue และระบบที่ใช้เดเบียนคือแพ็คเกจที่มีชื่อว่าgddrescue
:
sudo apt install gddrescue
สำหรับ distros อื่น ๆ ให้ตรวจสอบระบบการจัดการแพ็คเกจของคุณสำหรับรุ่นGNUของ ddrescue
ทางออกอื่น:
cat file1 | tee -a file2
tee
มีประโยชน์ที่คุณสามารถผนวกเข้ากับไฟล์ได้มากเท่าที่คุณต้องการตัวอย่างเช่น
cat file1 | tee -a file2 file3 file3
จะผนวกเนื้อหาของfile1
การfile2
, และfile3
file4
จากหน้าคน:
-a, --append
append to the given FILEs, do not overwrite
cat
อาจเป็นทางออกที่ง่าย แต่ที่ช้ามากเมื่อเราต่อไฟล์ขนาดใหญ่เข้าด้วยกันfind -print
คือช่วยคุณแม้ว่าคุณจะต้องใช้แมวหนึ่งครั้ง
amey@xps ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt
amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt
real 0m3.084s
user 0m0.012s
sys 0m2.308s
amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1
real 0m2.516s
user 0m0.028s
sys 0m2.204s
time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)
และควรให้ผลลัพธ์ที่คล้ายกันกับคำสั่ง cat เท่านั้นของคุณ
คุณสามารถทำสิ่งนี้ได้โดยไม่ต้องcat
แม้ว่าcat
จะอ่านง่ายกว่า:
>> file1 < file2
>>
ผนวกSTDINไปfile1
และ<
ทิ้งfile2
ไปSTDIN