Windows上有猫的替代品吗?


309

我需要*.bat在Windows 上使用脚本将两个二进制文件连接在一起。

我该如何实现?


15
您的标题问题和描述问题并不完全同步。类型是标题问题的最佳答案,而副本/ b是描述问题的最佳答案。如果可能,您可能想更改该标题。
约瑟夫

2
@Joseph type只能替换的部分cat功能(由于Windows上二进制文件和文本文件的区别)。
jfs

Answers:


452

Windows type命令的工作方式与UNIX类似cat

范例1:

type file1 file2 > file3

等价于:

cat file1 file2 > file3

范例2:

type  *.vcf > all_in_one.vcf  

此命令会将所有vcard合并为一个。


1
这种情况下类型的问题在于,在命令行上键入多个文件时,会添加不需要的文件头。
格雷格(Greg Hewgill)

2
当在命令行上指定多个文件时,在复制文件内容之前,请键入输出一些空白行和文件名。尝试一下:)
Greg Hewgill'Sep

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
对于文件序列,您可以使用通配符,例如“ copy / b file * destfile”
Stalinko 2014年

令我感到奇怪的是,鉴于已接受答案type的注释中列出的明显问题,这不是已接受答案...除非此解决方案具有类似缺点,但不足以使人们注意到它们!
强尼·瑟弗

23

如果您可以控制工作所在的计算机,强烈建议安装GnuWin32。只需“全部下载”,然后让wget程序检索所有软件包。然后,您将可以访问cat,grep,find,gzip,tar,更少以及数百种其他内容。

GnuWin32是我在新的Windows机器上安装的第一批东西。


我会推荐GetGnuWin32(以简化安装)
jfs

3
如果可以使用外部实用程序,则我更喜欢Windows的busybox,它是一个包含约30个Unix实用程序的单个〜600 kB exe。唯一的不同是,应该使用“ busybox cat”命令而不是简单的“ cat”
Fr0sT 2014年

12

无耻的PowerShell插件(因为我认为学习过程很痛苦,因此随时学习可以有所帮助)

Get-Content file1,file2

请注意,这type是Get-Content的别名,因此,如果您更喜欢它,可以编写:

type file1,file2

1
它有效,但是速度很慢。我在等待Powershell连接一些大型视频文件时发现了这个问题,每个文件要花费半小时。我终止了该过程,并使用cmd对其进行了尝试type file1 file2 > dest,每个过程都在几秒钟内完成。
stib


由于某种原因,它将我的文件转换为UTF-16。-Encoding UTF8没有改变任何东西。
约翰·德沃夏克

5

只需对多个源文件和一个目标文件使用dos copy命令。

copy file1+file2 appendedfile

您可能需要/ B选项用于二进制文件


2

在Windows 10的Redstone 1版本中,Windows为NTOS内核添加了一个真正的Linux子系统。我认为最初是为了支持Android应用程序,也许是Docker类型的方案。微软与Canonical合作,并添加了一个实际的本机bash shell。另外,您可以使用apt软件包管理器来获取许多Ubuntu软件包。例如,您可以像在Linux机器上一样执行apt-get gcc来安装GCC工具链。

如果我上大学时就存在这样的事情,我想我可以在本地Windows bash shell中完成大部分Unix编程任务。


1

如果您只想在现有文件的末尾附加文本,则可以使用>>管道。例如:

echo new text >>existingFile.txt

0

如果您必须使用批处理脚本并安装了python,则可以在批处理和python中找到一个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,用法将是:

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

也感谢这个答案的灵感。


0

我尝试重新加入已在Linux服务器中拆分的tar存档。

我发现如果type在Windows操作系统中使用cmd.exe,它将导致文件以错误的顺序连接(即type有时会先放置XXXX.ad,然后放XXXX.ac,XXXX.aa等。)

因此,我bat在GitHub https://github.com/sharkdp/bat中找到了一个名为Windows 的工具,该工具具有Windows版本,并且代码突出显示效果更好,重要的是,它在Windows上可以正常工作以重新加入tar存档!


0

因此,我一直在寻找一种类似的解决方案来保留EOL字符,却发现没有办法,所以我尽力而为,发挥了自己的效用。这是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

我称它为Sharp-cat,因为它是C#内置的,可以随时使用防病毒软件进行扫描,并且可以根据要求提供源代码


-1

Windows type命令有问题,例如512字节边界上的Unicode字符。尝试Cygwin的猫。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.