มีการแทนที่ cat บน Windows หรือไม่


309

ฉันต้องเข้าร่วมไบนารีไฟล์สองไฟล์ด้วย*.batสคริปต์บน Windows

ฉันจะบรรลุสิ่งนั้นได้อย่างไร


15
คำถามชื่อและคำถามคำอธิบายของคุณไม่ได้ซิงค์กันทั้งหมด ประเภทจะเป็นคำตอบที่ดีที่สุดสำหรับคำถามชื่อและคัดลอก / b จะเป็นคำตอบที่ดีที่สุดสำหรับคำถามคำอธิบาย คุณอาจต้องการเปลี่ยนชื่อนั้นถ้าเป็นไปได้
โจเซฟ

2
@Joseph typeสามารถแทนที่catฟังก์ชันการทำงานบางส่วนเท่านั้น(เนื่องจากความแตกต่างระหว่างไฟล์ไบนารีและไฟล์ข้อความบน Windows)
jfs

ข้ามซ้ำ: superuser.com/q/434870/52365
GSerg

คำตอบ:


452

หน้าต่างคำสั่งทำงานคล้ายกับระบบปฏิบัติการยูนิกซ์typecat

ตัวอย่างที่ 1:

type file1 file2 > file3

เทียบเท่ากับ:

cat file1 file2 > file3

ตัวอย่างที่ 2:

type  *.vcf > all_in_one.vcf  

คำสั่งนี้จะรวม vcards ทั้งหมดไว้ในที่เดียว


1
ปัญหาเกี่ยวกับประเภทในสถานการณ์นี้คือมันเพิ่มส่วนหัวของไฟล์ที่ไม่ต้องการเมื่อพิมพ์มากกว่าหนึ่งไฟล์ที่ระบุในบรรทัดคำสั่ง
Greg Hewgill

2
เมื่อระบุมากกว่าหนึ่งไฟล์บนบรรทัดคำสั่งให้พิมพ์บรรทัดว่างสองสามบรรทัดและชื่อของไฟล์ก่อนที่จะคัดลอกเนื้อหาของไฟล์ ลองมัน :)
เกร็ก Hewgill

3
อาฉันไม่ได้สังเกตเห็นว่าส่วนหัวไปที่ stderr ดีแล้วที่รู้.
Greg Hewgill

1
โปรดทราบว่าประเภทที่มีลูกศร (ดังกล่าว) ไม่สามารถใช้งานกับไฟล์ขนาดใหญ่ (เช่น> 2 GB หรือ 4) อย่างน้อยกับ XP คุณสามารถใช้คำสั่ง "คัดลอก" ได้ (ดูคำตอบอื่น ๆ )
rogerdpack

2
เคล็ดลับอื่น: เพื่อหลีกเลี่ยงการแสดงผลลัพธ์อื่น ๆtype file1 file2 > file3 2>NUL
Mike T

85

คุณสามารถใช้copy /bสิ่งนี้:

copy /b file1+file2 destfile

5
สำหรับลำดับของไฟล์คุณสามารถใช้ wildcard เช่น "copy / b file * destfile"
Stalinko

แปลกสำหรับฉันว่านี่ไม่ใช่คำตอบที่ได้รับให้กับปัญหาที่ชัดเจนกับtypeความคิดเห็นในคำตอบที่ได้รับการยอมรับ ... เว้นแต่วิธีนี้มีข้อบกพร่องที่คล้ายกัน แต่ไม่เป็นที่นิยมพอสำหรับคนที่จะบันทึก '!
Jony เจริญเติบโต

23

หากคุณมีการควบคุมมากกว่าเครื่องที่คุณกำลังทำผลงานของคุณผมขอแนะนำให้ติดตั้งGnuWin32 เพียงแค่ "ดาวน์โหลดทั้งหมด" และให้โปรแกรม wget ดึงแพ็คเกจทั้งหมด จากนั้นคุณจะสามารถเข้าถึง cat, grep, find, gzip, tar, less และอื่น ๆ อีกหลายร้อยรายการ

GnuWin32 เป็นหนึ่งในสิ่งแรกที่ฉันติดตั้งในกล่อง Windows ใหม่


ฉันจะแนะนำ GetGnuWin32 (การติดตั้งง่าย)
jfs

3
หากใช้ยูทิลิตี้ภายนอกเป็นที่ยอมรับฉันต้องการใช้ busybox สำหรับ Windows ซึ่งเป็น exe ขนาด 600 ~ 600 kB ที่รวมเอายูทิลิตี้ ~ 30 Unix ข้อแตกต่างอย่างเดียวคือควรใช้คำสั่ง "busybox cat" แทน "cat" แบบง่าย ๆ
Fr0sT

12

ปลั๊ก PowerShell ไร้ยางอาย (เพราะฉันคิดว่าช่วงการเรียนรู้เป็นความเจ็บปวดดังนั้นการสอนอะไรบางอย่างที่โอกาสใด ๆ สามารถช่วยได้)

Get-Content file1,file2

โปรดทราบว่าtypeเป็นนามแฝงสำหรับการรับเนื้อหาดังนั้นถ้าคุณชอบดีกว่าคุณสามารถเขียน:

type file1,file2

1
มันใช้งานได้ แต่มันเป็นสุนัขที่ช้า ฉันพบคำถามนี้ขณะรอให้ PowerShell ต่อเชื่อมไฟล์วิดีโอขนาดใหญ่บางไฟล์ซึ่งใช้เวลาครึ่งชั่วโมงต่อไฟล์ ฉันฆ่ากระบวนการและลองใช้คำสั่ง cmd type file1 file2 > destและแต่ละอันก็ทำได้ในไม่กี่วินาที
stib


มันแปลงไฟล์ของฉันเป็น UTF-16 ด้วยเหตุผลบางอย่าง -Encoding UTF8ไม่ได้เปลี่ยนแปลงอะไรเลย
John Dvorak

5

เพียงใช้คำสั่ง dos copy ที่มีไฟล์ต้นฉบับหลายไฟล์และไฟล์ปลายทางหนึ่งไฟล์

copy file1+file2 appendedfile

คุณอาจต้องการตัวเลือก / B สำหรับไฟล์ไบนารี


2

ในรีลีส Redstone 1 ของ Windows 10 Windows ได้เพิ่มระบบย่อย Linux จริงสำหรับเคอร์เนล NTOS ฉันคิดว่าเดิมมีวัตถุประสงค์เพื่อสนับสนุนแอพ Android และอาจเป็นประเภทนักเทียบท่า Microsoft ร่วมมือกับ Canonical และเพิ่มเชลล์ bash จริง นอกจากนี้คุณยังสามารถใช้ apt package manager เพื่อรับแพ็คเกจ Ubuntu มากมาย ตัวอย่างเช่นคุณสามารถทำ apt-get gcc เพื่อติดตั้งโซ่เครื่องมือ GCC ได้ตามต้องการบนกล่อง Linux

หากสิ่งนั้นมีอยู่ในขณะที่ฉันอยู่ในมหาวิทยาลัยฉันคิดว่าฉันน่าจะได้ทำเรื่องการเขียนโปรแกรม Unix เกือบทั้งหมดใน bash shell ของ Windows


1

หากคุณต้องการเพิ่มข้อความต่อท้ายไฟล์ที่มีอยู่คุณสามารถใช้ไพพ์ >> อดีต:

echo new text >>existingFile.txt

0

หากคุณต้องใช้สคริปต์ชุดและติดตั้งหลามที่นี่เป็นคำตอบpolygotในชุดและหลาม:

1>2# : ^
'''
@echo off
python "%~nx0" " %~nx1" "%~nx2" "%~nx3"
exit /b
rem ^
'''
import sys
import os

sys.argv = [argv.strip() for argv in sys.argv]
if len(sys.argv) != 4:
    sys.exit(1)

_, file_one, file_two, out_file = sys.argv

for file_name in [file_one, file_two]:
    if not os.path.isfile(file_name):
        print "Can't find: {0}".format(file_name)
        sys.exit(1)

if os.path.isfile(out_file):
    print "Output file exists and will be overwritten"

with open(out_file, "wb") as out:
    with open(file_one, "rb") as f1:
        out.write(f1.read())

    with open(file_two, "rb") as f2:
        out.write(f2.read())

หากบันทึกเป็นการใช้งานเข้าร่วมค้างคาวจะเป็น:

join.bat file_one.bin file_two.bin out_file.bin

ขอบคุณด้วยคำตอบนี้สำหรับแรงบันดาลใจ


0

ฉันพยายามเข้าร่วมไฟล์เก็บถาวร tar อีกครั้งซึ่งแบ่งออกเป็นเซิร์ฟเวอร์ Linux

และฉันพบว่าถ้าฉันใช้typeใน Windows cmd.exeมันจะทำให้ไฟล์เข้าร่วมในลำดับที่ไม่ถูกต้อง (เช่นtypeบางครั้งจะทำให้ XXXX.ad อยู่ก่อนแล้ว XXXX.ac, XXXX.aa ฯลฯ ... )

ดังนั้นฉันจึงพบเครื่องมือชื่อbatใน GitHub https://github.com/sharkdp/batซึ่งมี Windows build และมีการเน้นโค้ดที่ดีขึ้นและสิ่งที่สำคัญคือมันทำงานได้ดีบน Windows เพื่อเข้าร่วมคลังข้อมูล tar!


0

ดังนั้นฉันจึงกำลังมองหาวิธีแก้ปัญหาที่คล้ายกันกับความสามารถในการรักษา EOL chars และพบว่าไม่มีวิธีดังนั้นฉันทำสิ่งที่ฉันทำดีที่สุดและทำให้ประโยชน์ของฉันเองนี่คือแมวพื้นเมืองที่ปฏิบัติการได้สำหรับ windows - https: // mega nz / #! 6AVgwQhL! qJ1sxx-tLtpBkPIUx__iQDGKAIfmb21GHLFerhNoaWk

Usage: cat file1 file2 file3 file4 -o output.txt
-o | Specifies the next arg is the output, we must use this rather than ">>" to preserve the line endings

ฉันเรียกว่าชาร์ปแคทที่สร้างขึ้นด้วย C # อย่าลังเลที่จะสแกนด้วยแอนติไวรัสและซอร์สโค้ดจะมีให้ตามคำขอ


-1

คำสั่งชนิด Windows มีปัญหาตัวอย่างเช่นอักขระ Unicode ในขอบเขต 512 ไบต์ ลองแมวของ Cygwin

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