จะเข้าร่วมไฟล์ข้อความได้อย่างไร?


21

ฉันบันทึกเอกสารจำนวนมากเป็น txt ฉันต้องการพิมพ์มันด้วยกันก่อนอื่นฉันต้องการให้มันรวมกันเป็นไฟล์เดียว คำสั่งซื้อไม่สำคัญในกรณีนี้

ฉันต้องการโซลูชันที่ไม่เกี่ยวข้องกับการพิมพ์ชื่อของไฟล์ที่จะผสาน แต่หนึ่งที่จะรวมไฟล์ txt ทั้งหมดภายในโฟลเดอร์

ฉันสามารถใช้คำสั่งหรือ GUI ได้หรือไม่?


ผมมองที่นี่ joinไม่ทราบวิธีการใช้งาน

คำตอบ:


43

ใช้catกับการเปลี่ยนเส้นทางผลลัพธ์ ไวยากรณ์: cat file [file] [[file] ...] > joined-file.

ตัวอย่างที่มีเพียงสองไฟล์ (คุณสามารถมีได้อีกมาก):

$ echo "some text in a file" > file1
$ echo "another file with some text" > file2
$ cat file1 file2 > mergedfiles
$ cat mergedfiles
some text in a file
another file with some text

ในกรณีที่คุณมี "เอกสารจำนวนมาก" ใช้ประโยชน์จากเปลือกกลม (รูปแบบ):

cat input-files-dir/* > joined-file

สิ่งนี้จะรวมไฟล์ทั้งหมดในไดเรกทอรีนั้นเข้ากับไดเรกทอรีปัจจุบัน (ป้องกันไม่ให้ตรงกับไฟล์ที่ส่งออกเอง) มันเป็นอิสระโดยสิ้นเชิงกับการใช้catและการเปลี่ยนเส้นทางการส่งออก - catเป็นเพียงทุบตีให้ไฟล์ทั้งหมดที่เป็นข้อโต้แย้งที่จะ


ประเภทไฟล์

มันจะทำการรวมไฟล์เข้าด้วยกันเช่นเดียวกับที่คุณทำกับกระดาษและเทป ไม่สนใจรูปแบบไฟล์จริงที่สามารถจัดการได้ มันจะใช้งานได้กับไฟล์ข้อความ แต่ไม่ใช่สำหรับ PDF, ODT และอื่น ๆ มันจะรวมเข้าด้วยกัน แต่ไม่ใช่ PDF / ODT ที่ถูกต้องอีกต่อไป


ลำดับการเข้าร่วม

ในขณะที่phoibos ชี้ให้เห็นว่าการเปล่งประกายของเชลล์จะทำให้ชื่อไฟล์เรียงตามตัวอักษร นี่คือการที่ Bash และ Shell globbing ทำงาน


ภาคผนวกเกี่ยวกับinput file is output fileข้อผิดพลาด

เมื่อรูปแบบของไฟล์อินพุตตรงกับไฟล์เดียวกันกับที่เป็นเอาต์พุตสิ่งนี้จะทำให้เกิดข้อผิดพลาด มันเป็นคุณสมบัติด้านความปลอดภัย ตัวอย่าง: การcat *.txt > out.txtรันครั้งที่สองจะทำให้เกิดสิ่งนี้

คุณสามารถทำอะไรได้บ้าง:

  • เลือกรูปแบบที่เฉพาะเจาะจงมากขึ้นเพื่อจับคู่ไฟล์อินพุตที่แท้จริงไม่ตรงกับชื่อเอาต์พุต ตัวอย่าง: รูปแบบไฟล์อินพุต*.txtพร้อมไฟล์เอาต์พุตoutput.outจะไม่ชนกัน
  • ทำงานในไดเรกทอรีต่าง ๆ ในตัวอย่างข้างต้นฉันใช้input-files-dirไดเรกทอรีแยกเพื่อวางไฟล์ทั้งหมดและส่งออกไปยังไดเรกทอรีการทำงานปัจจุบัน สิ่งนี้ทำให้ไม่สามารถรับข้อผิดพลาดนี้ได้

@cipricus ใช่ แต่มันเป็นเปลือกพื้นฐานมาก ๆ (รูปแบบ) ลองรูปแบบของคุณโดยใช้lsเพียงแค่รายการการแข่งขัน เช่นls *.txtดูสิ่งที่กำลังจับคู่
gertvdijk

2
@cipricus เกี่ยวกับ cat * .txt> JoinFile.txt?
Sadi

1
นี่คือความรู้สึกร่วมกันมากขึ้นจริงแมวแรกจับ txt ไฟล์ทั้งหมดและครั้งที่สองก็ร่วมกับพวกเขาและสามจะสร้างไฟล์ .txt ใหม่ที่ไม่สามารถติดที่ขั้นตอนแรก ;-)
Sadi

1
@cipricus มันแค่เข้าร่วมไฟล์ เช่นเดียวกับที่คุณทำโดยใช้กระดาษกาวและเทป! รูปแบบไฟล์ "เอกสาร" ส่วนใหญ่เช่น PDF ซึ่งถูกบีบอัดไม่อนุญาตให้ทำเช่นนี้ ใช้โปรแกรมแก้ไข PDF แต่อย่างไรก็ตามคำถามของคุณเป็นเรื่องเกี่ยวกับไฟล์ข้อความ
gertvdijk

1
ฉันเข้าใจอย่างถ่องแท้ว่าวิธีที่คุณแนะนำ (การสร้างส่วนย่อยการย้ายไฟล์และการเข้าร่วม) อาจเป็นวิธีที่ดีกว่าในบางกรณี แต่ถ้าเราเพียงต้องการที่จะเข้าร่วมไฟล์ข้อความทั้งหมด (ทั้งหมดที่มีนามสกุล. txt) ในไดเรกทอรีปัจจุบัน cat * .txt> JoinFile.txt ทำงานได้อย่างสมบูรณ์แบบ ฉันเพิ่งทดสอบมันออกมาจากความอยากรู้และมันใช้งานได้และดูเหมือนว่า cipricus ก็พบผลลัพธ์เดียวกัน (และระบบเริ่มบ่นว่าเราไม่ควรแชทที่นี่มิฉะนั้นฉันจะถามว่าคุณสามารถสอนสามเณรนี้ได้อย่างไรว่าคุณสามารถใช้การจัดรูปแบบในความคิดเห็นเหล่านี้ได้โดยไม่ต้องใช้แถบเครื่องมือ ;-)
Sadi

12

วิธีง่ายๆในการทำเช่นนั้นคือการใช้ cat:

cat file1 file2 > joined_file

หากคุณเพิ่งออกcat file1 file2คุณจะเห็นไฟล์ทั้งสองในการส่งออกมาตรฐาน ด้วยการใช้>คุณเพียงแค่เปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปยังไฟล์ ที่จะทำงานด้วยคำสั่งอื่น


โปรดอ่านคำถาม คุณกำลังบอกให้ระบุชื่อไฟล์แต่ละไฟล์ซึ่ง OP โดยเฉพาะไม่ต้องการทำ!
ศรี

2
นั่นไม่ได้อยู่ในคำถามเดิม ฉันไม่ได้อัปเดตคำตอบของฉันเนื่องจากมีคำตอบที่ครบถ้วนมากกว่าปรากฏขึ้น
Jorge Suárez de Lis

@ JorgeSuárezdeLisในขณะที่คำตอบนี้ไม่ได้ช่วย OP โดยตรงกับคำถามของเขา / เธอโปรดทราบว่าคำตอบนี้อาจช่วยคนอื่นที่มีไฟล์เพียงไม่กี่ไฟล์ที่พวกเขาต้องการผสาน (เฮ้เฮ้อย่างฉัน! ขอบคุณ! ^ - ^) +1
Souta

@ JorgeSuárezdeLisแน่นอน คุณได้ตอบการแก้ไขที่ 2ของคำถามได้อย่างสมบูรณ์แบบ ไม่กี่นาทีต่อมาแก้ไข 3เปลี่ยนข้อกำหนดเกี่ยวกับคำตอบ
gertvdijk

5

ทำได้ด้วยการวนซ้ำง่ายๆ

for i in *.txt; do cat "$i" >> complete.txt; done

>> ต่อท้ายไฟล์

หมายเหตุ: หากด้วยเหตุผลบางประการที่คุณต้องเรียกใช้คำสั่งอีกครั้งคุณจะต้องลบcomplete.txtมิฉะนั้นคุณจะต้องเขียนไฟล์ไปยังตัวมันเองซึ่งไม่ได้ผล


5
สิ่งนี้จะได้ผลเช่นกัน แต่ฉันไม่เห็นความจำเป็นในการ for-loop ถ้าคุณสามารถใช้อาร์กิวเมนต์catได้
gertvdijk

1
ใช่คุณพูดถูก ฉันแค่ไม่แน่ใจเกี่ยวกับการสั่งซื้อ sord cat *.txtใช้ ห่วงสำหรับควรจะเรียงลำดับ
phoibos

1
เปิดออก* รับประกันได้ว่าจะตามลำดับตัวอักษร
phoibos

ใช่มันเป็นเปลือกเดียวกันที่แน่นอน ไม่สำคัญว่าคุณจะใช้มันในforที่ใดก็ได้ใน Bash
gertvdijk

4

หากไฟล์ที่คุณต้องการรวมปลายทั้งหมดเข้า.txtไว้ให้เรียบง่าย:

cat *.txt > combined.txt

หากไดเรกทอรีมีเพียงไฟล์ข้อความก็ยังง่าย:

cat * > combined.txt

(โปรดทราบว่าเมื่อคุณสร้างcombined.txtการทำอีกครั้งจะรวมไว้ในส่วนขยายที่*นำไปสู่พฤติกรรมที่ไม่ปกติ)

หากคุณต้องการเลือกไฟล์บางไฟล์ในไดเรกทอรีและไม่ใช่ไฟล์อื่น ๆ จะเป็นการดีที่สุดถ้าชื่อไฟล์อนุญาตให้คุณแยกแยะไฟล์ที่คุณต้องการ findถ้าไม่ได้คุณจะได้รับแฟนซีกับ แต่ฉันสงสัยว่าคุณต้องไปไกลขนาดนั้น


ขอบคุณ หากคุณดูความคิดเห็นต่อคำตอบที่ยอมรับ Sadi แนะนำว่าในความคิดเห็น หากคำตอบของคุณเป็นคนแรกคุณจะได้ในสิ่งที่ฉันต้องการ ลองดูที่เหมืองด้วย: เพิ่มเข้าไปในเมนูกำหนดเอง

ขอบคุณสำหรับความคิดเห็น. ใช่ฉันเห็นมันตอนนี้มันเป็นบิตบดบัง ...
อเล็กซิส

4

สคริปต์การกระทำที่กำหนดเองของ Thunar ที่เขียนโดยcipricusยังเป็นแรงบันดาลใจให้ฉันเขียนสคริปต์ Nautilus ที่คล้ายกันและฉันคิดว่ามันอาจจะมีประโยชน์สำหรับผู้อื่นที่ดูคำถาม & คำตอบนี้เพื่ออ้างอิงในเรื่องนี้ ดังนั้นนี่คือ:

#!/bin/sh
#Nautilus Script to join selected text files in a single file and open the joined file with default text editor
#
IFS=$'\n'
FILENAME="JoinedFile_$(date +%Y-%m-%d-%H-%M-%S).txt"
cat "$@" > "$FILENAME"
xdg-open "$FILENAME"

@ David Foerster ขอบคุณสำหรับการแก้ไข ฉันไม่ได้มีปัญหาใด ๆ กับรุ่นเก่า (กับกรณีทดสอบที่ จำกัด ของฉัน) และฉันไม่เห็นปัญหาใด ๆ กับรุ่นปรับปรุงนี้เช่นกัน ขออภัยถ้าฉันทำให้เกิดความไม่สะดวกเนื่องจากข้อบกพร่องในรุ่นก่อนหน้า
Sadi

มันไม่ได้มีข้อบกพร่อง แต่มันมีลูปที่ไม่จำเป็นซึ่งทำให้โค้ดนั้นยากต่อการเข้าใจมากขึ้น imho
David Foerster

2

นี่คือส่วนเติมเต็มและรูปแบบที่แตกต่างไปจากคำตอบอื่น ๆ ที่เกี่ยวข้องกับการนำโซลูชั่นเหล่านี้ไปใช้ในการกระทำของ Thunar

ไม่ใช่ว่าทุกคนจะสามารถใช้ได้ในลักษณะนี้ แต่บางคนก็เป็นเช่นนั้น

ผมคิดว่าน่าสนใจที่สุดที่จะสามารถที่จะรวมไฟล์ที่เลือกจากเมนูบริบทของ Thunar

นี่คือรูปแบบที่แตกต่างจากสิ่งที่Sadiแนะนำในความคิดเห็นต่อคำตอบของgertvdijk :

   cat %N > JoinedFile

ไฟล์ที่เลือกเท่านั้นที่จะเข้าร่วม จำกัด เงื่อนไขลักษณะที่ปรากฏของไฟล์ข้อความ

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


ขอขอบคุณเป็นพิเศษสำหรับSadiซึ่งความคิดเห็นให้ฉันด้วยวิธีการแก้ปัญหาที่ชัดเจนและตรงประเด็นที่สุด

ฉันยอมรับคำตอบของgertvdijkแล้ว ไม่เพียง แต่เป็นโอกาสในการแสดงความคิดเห็นของ Sadi แต่ดูเหมือนว่าจะเป็นประโยชน์ต่อผู้อื่นมากขึ้นโดยให้การแก้ปัญหาที่ถกเถียงกันและสมบูรณ์ (แม้ว่าจะค่อนข้างเหนือทักษะการอ่าน CLI ของฉัน)


2

คุณสามารถลองfindสั่งด้วย

find . -name "*.txt" -type f -exec cat {} + > file

มันค้นหา .txtไฟล์ภายในไดเรกทอรีปัจจุบันและดำเนินการcatคำสั่งในแต่ละไฟล์ที่พบ ในที่สุดผลลัพธ์ทั้งหมดถูกเปลี่ยนเส้นทางไปยังชื่อไฟล์file(สร้างขึ้นภายในปัจจุบันโดยตรง)

คำอธิบาย:

.                  # current directory

-name              # helps to find only .txt files.

-type f            # Only files

-exec cat {} +     # helps to run cat command on the founded .txt files.

>                  # Output redirection operator

file               # to store final output.

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