วิธีที่เร็วและจริงจังที่สุดในการรวมไฟล์ * .txt ทั้งหมดในไดเรกทอรีเป็นไฟล์ข้อความขนาดใหญ่หนึ่งไฟล์คืออะไร
ขณะนี้ฉันใช้ windows กับ cygwin ดังนั้นฉันจึงสามารถเข้าถึง BASH ได้
คำสั่งเชลล์ของ Windows จะดีเช่นกัน แต่ฉันสงสัยว่ามันมีอยู่
วิธีที่เร็วและจริงจังที่สุดในการรวมไฟล์ * .txt ทั้งหมดในไดเรกทอรีเป็นไฟล์ข้อความขนาดใหญ่หนึ่งไฟล์คืออะไร
ขณะนี้ฉันใช้ windows กับ cygwin ดังนั้นฉันจึงสามารถเข้าถึง BASH ได้
คำสั่งเชลล์ของ Windows จะดีเช่นกัน แต่ฉันสงสัยว่ามันมีอยู่
คำตอบ:
ส่วนนี้จะผนวกเอาท์พุทไปที่ all.txt
cat *.txt >> all.txt
นี่เขียนทับ all.txt
cat *.txt > all.txt
echo *.txt | xargs cat > all.txt
เพียงจำไว้ว่าสำหรับการแก้ปัญหาทั้งหมดที่ให้มาจนถึงตอนนี้เชลล์จะตัดสินใจลำดับการเรียงไฟล์ สำหรับ Bash, IIRC นั้นเป็นลำดับตัวอักษร หากการสั่งซื้อมีความสำคัญคุณควรตั้งชื่อไฟล์อย่างเหมาะสม (01file.txt, 02file.txt, ฯลฯ ... ) หรือระบุแต่ละไฟล์ตามลำดับที่คุณต้องการให้เรียงกัน
$ cat file1 file2 file3 file4 file5 file6 > out.txt
คำสั่งเชลล์ของ Windows type
สามารถทำสิ่งนี้:
type *.txt >outputfile
type
คำสั่งType ยังเขียนชื่อไฟล์ไปยัง stderr ซึ่งไม่ได้ถูกจับโดย>
โอเปอเรเตอร์การเปลี่ยนเส้นทาง (แต่จะแสดงบนคอนโซล)
คุณสามารถใช้เชลล์ Windows copy
เพื่อต่อไฟล์เข้าด้วยกัน
C:\> copy *.txt outputfile
จากความช่วยเหลือ:
ในการผนวกไฟล์ให้ระบุไฟล์เดียวสำหรับปลายทาง แต่มีหลายไฟล์สำหรับแหล่งที่มา (โดยใช้สัญลักษณ์แทนหรือรูปแบบ file1 + file2 + file3)
โปรดระวังเนื่องจากวิธีการเหล่านี้ไม่สามารถทำงานกับไฟล์จำนวนมากได้ ส่วนตัวผมใช้สายนี้:
for i in $(ls | grep ".txt");do cat $i >> output.txt;done
แก้ไข: ตามที่มีคนพูดในความคิดเห็นคุณสามารถแทนที่$(ls | grep ".txt")
ด้วย$(ls *.txt)
แก้ไข: ขอบคุณ @gnourf_gnourf ความเชี่ยวชาญการใช้globเป็นวิธีที่ถูกต้องในการวนซ้ำไฟล์ในไดเรกทอรี ดังนั้น$(ls | grep ".txt")
ต้องเปลี่ยนนิพจน์ดูหมิ่นเช่นนี้*.txt
(ดูบทความที่นี่ )
ทางออกที่ดี
for i in *.txt;do cat $i >> output.txt;done
for i in $(ls *.txt);do cat $i >> output.txt;done
ล่ะ
ls | grep
เป็น antipattern ไม่ดีอย่างจริงจัง)
ls *.txt
ล้มเหลวหรือไม่หากมีไฟล์มากเกินไป (ข้อผิดพลาดในรายการอาร์กิวเมนต์ยาวเกินไป)?
วิธีปฏิบัติมากที่สุดกับเชลล์คือคำสั่ง cat วิธีอื่น ๆ ได้แก่
awk '1' *.txt > all.txt
perl -ne 'print;' *.txt > all.txt
cat
วิธีการด้านบนทั้งหมดจะต่อกันบรรทัดสุดท้ายและบรรทัดแรกจากไฟล์ที่อยู่ติดกัน
วิธีการเกี่ยวกับวิธีนี้
find . -type f -name '*.txt' -exec cat {} + >> output.txt
-maxdepth 1
ไปยังfind
คำสั่ง
sort -u --output="$OUTPUT_FILE" --files0-from=- < <(find "$DIRECTORY_NAME" -maxdepth 1 -type f -name '*.txt' -print0)
type [source folder]\*.[File extension] > [destination folder]\[file name].[File extension]
ตัวอย่างเช่น:
type C:\*.txt > C:\1\all.txt
ที่จะนำไฟล์ txt ทั้งหมดใน C: \ Folder และบันทึกใน C: \ 1 โฟลเดอร์ด้วยชื่อของ all.txt
หรือ
type [source folder]\* > [destination folder]\[file name].[File extension]
ตัวอย่างเช่น:
type C:\* > C:\1\all.txt
ที่จะนำไฟล์ทั้งหมดที่มีอยู่ในโฟลเดอร์และใส่เนื้อหาใน C: \ 1 \ all.txt
คุณสามารถทำสิ่งนี้:
cat [directory_path]/**/*.[h,m] > test.txt
หากคุณใช้{}
เพื่อรวมส่วนขยายของไฟล์ที่คุณต้องการค้นหาแสดงว่ามีปัญหาการเรียงลำดับ
เมื่อคุณพบปัญหาที่จะทำให้ all.txt เป็น all.txt คุณสามารถลองตรวจสอบว่า all.txt มีอยู่หรือไม่ถ้ามีอยู่ให้ลบ
แบบนี้:
[ -e $"all.txt" ] && rm $"all.txt"
cat *.txt > all.txt
>
เขียนทับคำสั่ง all.txt ถ้ามี>>
เพิ่มข้อมูลไปยังไฟล์ที่มีอยู่
ทั้งหมดนั้นน่ารังเกียจ ....
ls | grep *.txt | while read file; do cat $file >> ./output.txt; done;
สิ่งที่ง่าย
find . -iname "*.txt" -maxdepth 1 -exec cat {} >> out.txt \;