¿Hay reemplazo para cat en Windows

309

Necesito unir dos archivos binarios con un *.batscript en Windows.

¿Cómo puedo lograr eso?

Artem Tikhomirov
fuente
15
Su pregunta de título y su 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 typepuede reemplazar solo una parte de catla funcionalidad de (debido a la distinción entre archivos binarios y de texto en Windows).
jfs
Cruz-duplicado: superuser.com/q/434870/52365
GSerg

Respuestas:

452

El typecomando de Windows 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 fusionará todas las vcards en una.

Nathan Jones
fuente
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.
Greg Hewgill
2
Al especificar más de un archivo en la línea de comando, el tipo genera algunas líneas en blanco y el nombre del archivo, antes de copiar el contenido del archivo. Pruébelo :)
Greg Hewgill
3
Ah, no me había dado cuenta de que los encabezados van a stderr. Bueno saber.
Greg Hewgill
1
tenga en cuenta que escribir con la flecha (como arriba) no funciona con archivos grandes (como> 2 GB o 4), al menos con XP. Sin embargo, puede usar el comando "copiar" (ver otra respuesta).
rogerdpack
2
Otro consejo: para evitar mostrar cualquier otra salidatype file1 file2 > file3 2>NUL
Mike T
85

Puedes usar copy /basí:

copy /b file1+file2 destfile
Greg Hewgill
fuente
55
para la secuencia de archivos puede usar comodines como "copy / b file * destfile"
Stalinko
Es extraño para mí que esta no sea la respuesta aceptada, dados los problemas aparentes typedescritos en los comentarios sobre la respuesta aceptada ... ¡a menos que esta solución tenga inconvenientes similares pero no sea lo suficientemente popular como para que la gente los note!
Jony Thrive
23

Si tiene control sobre la máquina donde está haciendo su trabajo, le recomiendo instalar GnuWin32 . Simplemente "Descargar todo" y deje que el programa wget recupere todos los paquetes. Luego 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.

David Citron
fuente
Recomendaría GetGnuWin32 (para simplificar la instalación)
jfs
3
Si el uso de una utilidad externa es aceptable, 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
12

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

Get-Content file1,file2

Tenga en cuenta que typees un alias para Get-Content, por lo que si le gusta más, puede escribir:

type file1,file2
Jay Bazuzi
fuente
1
Funciona, pero es un perro lento. Encontré esta pregunta mientras esperaba a que Powershell concatenara algunos archivos de video grandes que demoraban media hora por archivo. Maté el proceso y lo intenté con cmd usando type file1 file2 > desty cada uno se hizo en segundos.
stib
Convirtió mis archivos en UTF-16, por alguna razón. -Encoding UTF8No cambió nada.
John Dvorak,
5

Simplemente use el comando dos copy con múltiples archivos de origen y un archivo de destino.

copy file1+file2 appendedfile

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

Simón
fuente
2

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

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

sam msft
fuente
1

Si simplemente desea agregar texto al final del archivo existente, puede usar el >> tubo. ex:

echo new text >>existingFile.txt
Jahmic
fuente
0

Si tiene que usar un script por lotes y tiene instalado Python, aquí hay una respuesta polygot en batch 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 se guarda como join.bat, el uso sería:

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

Gracias también esta respuesta por la inspiración.

Noelkd
fuente
0

Intento reunirme con el archivo tar que se ha dividido en un servidor Linux.

Y descubrí que si lo uso typeen Windows cmd.exe, causará que el archivo se una en un orden incorrecto (es decir, a typeveces pone XXXX.ad al principio y luego XXXX.ac, XXXX.aa, etc.)

Entonces, encontré una herramienta llamada baten GitHub https://github.com/sharkdp/bat que tiene una compilación de Windows y tiene un mejor resaltado de código y lo importante es que funciona bien en Windows para unirse al archivo tar.

Aaron Xu
fuente
0

Así que estaba buscando una solución similar con la habilidad de preservar los caracteres de EOL y descubrí que no había forma, así que hago lo que mejor hago e hice mi propia utilidad. Este es un gato nativo ejecutable 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

Lo llamo Sharp-cat ya que está construido con C #, no dude en escanear con un antivirus y el código fuente estará disponible a pedido

Ricky Divjakovski
fuente
-1

El comando de tipo Windows tiene problemas, por ejemplo, con caracteres Unicode en el límite de 512 bytes. Prueba el gato de Cygwin.

usuario42391
fuente