Existe substituto para o gato no Windows


309

Preciso juntar dois arquivos binários com um *.batscript no Windows.

Como posso conseguir isso?


15
Sua pergunta do título e sua descrição não estão totalmente sincronizadas. type seria a melhor resposta para a pergunta do título e copy / b seria a melhor resposta para a pergunta da descrição. Você pode alterar esse título, se possível.
Joseph

2
O @ Joseph typepode substituir apenas parte da catfuncionalidade (devido à distinção entre arquivos binários e arquivos de texto no Windows).
jfs

Respostas:


452

O typecomando do Windows funciona de maneira semelhante ao UNIX cat.

Exemplo 1:

type file1 file2 > file3

é equivalente a:

cat file1 file2 > file3

Exemplo 2:

type  *.vcf > all_in_one.vcf  

Este comando mesclará todos os cartões em um.


1
O problema com o tipo nessa situação é que ele adiciona cabeçalhos de arquivos indesejados ao digitar mais de um arquivo especificado na linha de comando.
Greg Hewgill 13/09/08

2
Ao especificar mais de um arquivo na linha de comando, digite gera algumas linhas em branco e o nome do arquivo, antes de copiar o conteúdo do arquivo. Experimente :)
Greg Hewgill

3
Ah, eu não tinha notado que os cabeçalhos vão para o stderr. Bom saber.
Greg Hewgill 13/09/08

1
observe que o tipo com a seta (como acima) não funciona com arquivos grandes (como> 2 GB ou 4), pelo menos com o XP. Você pode usar o comando "copiar" (ver outra resposta).
Rogerdpack

2
Outra dica: para evitar mostrar qualquer outra saídatype file1 file2 > file3 2>NUL
Mike T

85

Você pode usar copy /bassim:

copy /b file1+file2 destfile

5
para a sequência de arquivos que você pode usar curingas como "cópia de arquivo / b * destfile"
Stalinko

estranho para mim que essa não seja a resposta aceita, dados os problemas aparentes typedescritos nos comentários sobre a resposta aceita ... a menos que essa solução tenha desvantagens semelhantes, mas não seja popular o suficiente para que as pessoas as notem!
Jony Thrive

23

Se você tem controle sobre a máquina onde está realizando seu trabalho, eu recomendo instalar o GnuWin32 . Apenas "Download All" e deixe o programa wget recuperar todos os pacotes. Você terá acesso a cat, grep, find, gzip, tar, less e centenas de outros.

O GnuWin32 é uma das primeiras coisas que instalo em uma nova caixa do Windows.


Eu recomendaria GetGnuWin32 (para instalação simplificar)
jfs

3
Se o uso de um utilitário externo for aceitável, prefiro o busybox para Windows, que é um único exe ~ 600 kB que incorpora ~ 30 utilitários Unix. A única diferença é que se deve usar o comando "busybox gato" em vez de simples "gato"
Fr0sT

12

Plug Shameless PowerShell (porque eu acho que a curva de aprendizado é uma dor, então ensinar algo em qualquer oportunidade pode ajudar)

Get-Content file1,file2

Observe que typeé um alias para Get-Content; portanto, se você gosta mais, pode escrever:

type file1,file2

1
Funciona, mas é muito lento. Eu encontrei essa pergunta enquanto esperava o PowerShell concatenar alguns arquivos de vídeo grandes, que estavam demorando meia hora por arquivo. Eu matei o processo e tentei com o cmd usando type file1 file2 > deste cada um foi feito em segundos.
Stib


Ele converteu meus arquivos em UTF-16, por algum motivo. -Encoding UTF8não mudou nada.
John Dvorak

5

Basta usar o comando dos copy com vários arquivos de origem e um arquivo de destino.

copy file1+file2 appendedfile

Você pode precisar da opção / B para arquivos binários


2

Na versão Redstone 1 do Windows 10, o Windows adicionou um subsistema Linux real para o kernel NTOS. Penso que originalmente se destinava a suportar aplicativos Android, e talvez cenários do tipo docker. A Microsoft fez parceria com a Canonical e adicionou um shell bash nativo real. Além disso, você pode usar o gerenciador de pacotes apt para obter muitos pacotes do Ubuntu. Por exemplo, você pode executar o apt-get gcc para instalar a cadeia de ferramentas GCC como faria em uma caixa do Linux.

Se isso existisse enquanto eu estava na universidade, acho que poderia ter feito a maioria das minhas tarefas de programação Unix no shell nativo do Windows.


1

Se você simplesmente deseja acrescentar texto ao final do arquivo existente, pode usar o pipe >>. ex:

echo new text >>existingFile.txt

0

Se você precisar usar um script em lote e instalar o python aqui, há uma resposta poligota no lote e no python:

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())

Se salvo como join.bat, o uso seria:

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

Obrigado também esta resposta pela inspiração.


0

Eu tento reunir novamente o arquivo tar que foi dividido em um servidor Linux.

E eu descobri que se eu usar typeno Windows cmd.exe, ele fará com que o arquivo seja unido na ordem errada. ( typeOu seja, às vezes, coloca XXXX.ad primeiro e depois XXXX.ac, XXXX.aa etc ...)

Então, eu encontrei uma ferramenta nomeada batno GitHub https://github.com/sharkdp/bat que tem uma compilação do Windows, e tem melhor código destacado e o importante é que ela funciona bem no Windows para voltar ao arquivo tar!


0

Então, eu estava procurando uma solução semelhante com a capacidade de preservar os caracteres EOL e descobri que não havia maneira, então eu faço o que faço melhor e criei minha própria utilidade. Este é um gato nativo executável para 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

Eu o chamo de sharp-cat, pois é construído com C #, sinta-se à vontade para digitalizar com um antivírus e o código-fonte será disponibilizado mediante solicitação


-1

O comando de tipo do Windows tem problemas, por exemplo, com caracteres Unicode no limite de 512 bytes. Tente o gato de Cygwin.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.