Есть ли замена для кота на винде


309

Мне нужно объединить два бинарных файла с помощью *.batскрипта на Windows.

Как я могу этого достичь?


15
Ваш заглавный вопрос и ваш вопрос описания не полностью синхронизированы. type будет лучшим ответом на вопрос названия, а copy / b будет лучшим ответом на вопрос описания. Вы можете изменить это название, если это возможно.
Иосиф

2
@Joseph typeможет заменить только часть catфункциональности (из-за различия между двоичными и текстовыми файлами в Windows).
JFS

Кросс-дубликат: superuser.com/q/434870/52365
GSerg

Ответы:


452

typeКоманда Windows работает аналогично UNIX cat.

Пример 1:

type file1 file2 > file3

эквивалентно:

cat file1 file2 > file3

Пример 2:

type  *.vcf > all_in_one.vcf  

Эта команда объединит все карты в одну.


1
Проблема с типом в этой ситуации заключается в добавлении нежелательных заголовков файлов при вводе более одного файла, указанного в командной строке.
Грег Хьюгилл

2
Если в командной строке указано более одного файла, введите перед выводом содержимого файла несколько пустых строк и имя файла. Попробуйте :)
Грег Хьюгилл

3
Ах, я не заметил, что заголовки идут в stderr. Хорошо знать.
Грег Хьюгилл

1
обратите внимание, что тип со стрелкой (как указано выше) не работает с большими файлами (например,> 2 ГБ или 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

Мне странно, что это не принятый ответ, учитывая очевидные проблемы, typeизложенные в комментариях к принятому ответу ... если только это решение не имеет подобных недостатков, но недостаточно популярно, чтобы люди могли их заметить!
Джони

23

Если у вас есть контроль над машиной, на которой вы выполняете свою работу, я настоятельно рекомендую установить GnuWin32 . Просто «Скачать все» и позвольте программе wget получить все пакеты. После этого вы получите доступ к cat, grep, find, gzip, tar, less и сотням других.

GnuWin32 - это одна из первых вещей, которую я устанавливаю на новую Windows-коробку.


Я бы порекомендовал GetGnuWin32 (для упрощения установки)
jfs

3
Если использование внешней утилиты приемлемо, я бы предпочел busybox для Windows, который представляет собой исполняемый файл ~ 600 кБ, включающий ~ 30 утилит Unix. Единственное отличие состоит в том, что вместо простой «кошки» следует использовать команду «busybox cat»
Fr0sT

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

В выпуске Redstone 1 для Windows 10 Windows добавила настоящую подсистему Linux для ядра NTOS. Я думаю, что изначально он был предназначен для поддержки приложений Android, и, возможно, сценариев типа докера. Microsoft установила партнерские отношения с Canonical и добавила настоящую оболочку Bash. Также вы можете использовать менеджер пакетов apt для получения многих пакетов Ubuntu. Например, вы можете выполнить команду apt-get gcc, чтобы установить цепочку инструментов GCC, как это делается в Linux.

Если бы такая вещь существовала, когда я учился в университете, я думаю, что мог бы выполнить большинство моих заданий по программированию для Unix в собственной оболочке Windows bash.


1

Если вы просто хотите добавить текст в конец существующего файла, вы можете использовать >> pipe. например:

echo new text >>existingFile.txt

0

Если вам нужно использовать пакетный сценарий и установить Python, вот многоугольный ответ в пакетном и 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())

Если сохранить как join.bat, будет:

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 и имеет лучшее выделение кода, и важно то, что он отлично работает на Windows, чтобы присоединиться к архиву tar!


0

Поэтому я искал похожее решение с возможностью сохранения символов EOL и обнаружил, что нет никакого способа, поэтому я делаю то, что умею лучше всего, и делаю свою собственную утилиту. Это исполняемый файл native cat для windows - https: // mega. пг / #! 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 есть проблемы, например, с символами Unicode на границе 512 байт. Попробуйте кошку Cygwin.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.