2008-09-13 18 views
242

Necesito unir dos archivos binarios con un script *.bat en Windows.¿Hay un reemplazo para cat en Windows

¿Cómo puedo lograr eso?

+14

La pregunta del título y la pregunta de descripción no están totalmente sincronizadas. type sería la mejor respuesta para la pregunta del título y copy/b sería la mejor respuesta para la pregunta de descripción. Es posible que desee cambiar ese título si es posible. – Joseph

+2

@Joseph 'type' puede reemplazar solo parte de la funcionalidad de' cat' (debido a la distinción entre archivos binarios y de texto en Windows). – jfs

+1

Odio Windows por no usar los comandos de UNIX/LINUX – winklerrr

Respuesta

352

de Windows type comando funciona de manera similar a UNIX cat.

Ejemplo 1:

type file1 file2 > file3 

es equivalente a:

cat file1 file2 > file3 

Ejemplo 2:

type *.vcf > all_in_one.vcf 

Este comando se fusionará todos los vcards en uno.

+1

El problema con el tipo en esta situación es que agrega encabezados de archivo no deseados al escribir más de un archivo especificado en la línea de comando. –

+2

Al especificar más de un archivo en la línea de comando, escriba salidas unas pocas líneas en blanco y el nombre del archivo, antes de copiar el contenido del archivo. Pruébalo :) –

+1

Ah, no me había dado cuenta de que los encabezados van a stderr. Bueno saber. –

70

Puede utilizar copy /b así:

copy /b file1+file2 destfile 
+3

para la secuencia de archivos puede usar comodines como "copiar/b archivo * destfile" – Stalinko

3

sólo tiene que utilizar las dos copiar comando con varios archivos de origen y un archivo de destino.

copia archivo1 + archivo2 appendedfile

Es posible que necesite la opción/B para archivos binarios

9

Enchufe desvergonzado PowerShell (porque creo que la curva de aprendizaje es un dolor, por lo que enseñar algo a cualquier oportunidad puede ayudar)

Get-Content file1,file2 

Tenga en cuenta que type es un alias de Get-contenido, así que si te gusta mejor, se puede escribir:

type file1,file2 
+0

Funciona, pero es lento. Encontré esta pregunta mientras estaba sentado esperando que PowerShell concatenara algunos archivos de video de gran tamaño, lo que demoraba media hora por archivo. Maté el proceso y lo intenté con cmd usando 'type file1 file2> dest' y cada uno se realizó en segundos. – stib

+0

tenga cuidado, [powershell puede corromper sus archivos binarios, por ejemplo, ''\ n'' puede ser reemplazado por'' \ r \ n''] (http://stackoverflow.com/a/33959798/4279) – jfs

20

Si usted tiene control sobre la máquina en la que está haciendo su trabajo, le recomiendo instalar GnuWin32. Simplemente descargue todo y deje que el programa wget recupere todos los paquetes. A continuación, tendrá acceso a cat, grep, find, gzip, tar, less y cientos de otros.

GnuWin32 es una de las primeras cosas que instalo en una nueva caja de Windows.

+0

Lo recomendaría GetGnuWin32 (para simplificar la instalación) – jfs

+3

Si se acepta el uso de una utilidad externa, preferiría busybox para Windows, que es un único ~ 600 kB exe que incorpora ~ 30 utilidades Unix. La única diferencia es que uno debe usar el comando "busybox cat" en lugar del simple "cat" – Fr0sT

1

Si simplemente desea agregar texto al final del archivo existente, puede usar >> pipe. por ejemplo:

echo new text >>existingFile.txt 
0

Si usted tiene que utilizar un script por lotes y tienen instalado Python es aquí una respuesta polygot en lotes y 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()) 

Si guarda como el uso join.bat sería:

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

Gracias también this answer por la inspiración.

2

En la versión Redstone 1 de Windows 10, Windows agregó un subsistema Linux real para el kernel NTOS. Creo que originalmente estaba destinado a admitir aplicaciones de Android, y tal vez escenarios tipo docker.Microsoft se asoció con Canonical y agregó un shell de bash nativo real. Además, puede usar apt manager para obtener muchos paquetes de Ubuntu. Por ejemplo, puede hacer que apt-get gcc instale la cadena de herramientas GCC como lo haría en una caja Linux.

Si existiera tal cosa mientras estaba en la universidad, creo que podría haber hecho la mayoría de mis asignaciones de programación de Unix en el bash shell nativo de Windows.

Cuestiones relacionadas