C'è un sostituto per cat su Windows


309

Devo unire due file binari con uno *.batscript su Windows.

Come posso raggiungerlo?


15
La domanda del titolo e la domanda della descrizione non sono totalmente sincronizzate. type sarebbe la risposta migliore per la domanda del titolo e copy / b sarebbe la risposta migliore per la domanda di descrizione. Potresti voler cambiare quel titolo, se possibile.
Joseph,

2
@Joseph typepuò sostituire solo una parte delle catfunzionalità (a causa della distinzione tra file binari e file di testo su Windows).
jfs,

Duplicazione incrociata: superuser.com/q/434870/52365
GSerg

Risposte:


452

Il typecomando di Windows funziona in modo simile a UNIX cat.

Esempio 1:

type file1 file2 > file3

è equivalente a:

cat file1 file2 > file3

Esempio 2:

type  *.vcf > all_in_one.vcf  

Questo comando unirà tutte le vcard in una.


1
Il problema con il tipo in questa situazione è che aggiunge intestazioni di file indesiderate quando si digita più di un file specificato nella riga di comando.
Greg Hewgill,

2
Quando si specifica più di un file sulla riga di comando, digitare output alcune righe vuote e il nome del file, prima di copiare il contenuto del file. Provalo :)
Greg Hewgill,

3
Ah, non avevo notato che le intestazioni vanno a Stderr. Buono a sapersi.
Greg Hewgill,

1
si noti che digitare con la freccia (come sopra) non funziona con file di grandi dimensioni (come> 2 GB o 4), almeno con XP. Puoi usare il comando "copia", comunque (vedi altra risposta).
rogerdpack,

2
Un altro consiglio: per evitare di mostrare altri risultatitype file1 file2 > file3 2>NUL
Mike T

85

Puoi usare copy /bcosì:

copy /b file1+file2 destfile

5
per la sequenza di file è possibile utilizzare caratteri jolly come "copia / b file * destfile"
Stalinko

strano per me che questa non è la risposta accettata, dati gli apparenti problemi typeevidenziati nei commenti sulla risposta accettata ... a meno che questa soluzione non abbia svantaggi simili ma non sia abbastanza popolare da essere notata dalla gente!
Jony Thrive,

23

Se hai il controllo della macchina su cui stai lavorando, ti consiglio vivamente di installare GnuWin32 . Basta "Scarica tutto" e lasciare che il programma wget recuperi tutti i pacchetti. Avrai quindi accesso a cat, grep, find, gzip, tar, less e centinaia di altri.

GnuWin32 è una delle prime cose che installo in una nuova finestra di Windows.


Consiglierei GetGnuWin32 (per semplificare l'installazione)
jfs

3
Se l'uso di un'utilità esterna è accettabile, preferirei busybox per Windows che è un singolo exe da ~ 600 kB che incorpora ~ 30 utility Unix. L'unica differenza è che si dovrebbe usare il comando "busybox cat" invece del semplice "cat"
Fr0sT

12

Spina Shameless PowerShell (perché penso che la curva di apprendimento sia un dolore, quindi insegnare qualcosa in ogni occasione può aiutare)

Get-Content file1,file2

Nota che typeè un alias per Get-Content, quindi se ti piace di più, puoi scrivere:

type file1,file2

1
Funziona, ma è un cane lento. Ho trovato questa domanda mentre ero in attesa che powershell concatenasse alcuni file video di grandi dimensioni che impiegavano mezz'ora per file. Ho ucciso il processo e l'ho provato con cmd usando type file1 file2 > deste ognuno è stato fatto in pochi secondi.
Stib


Ha convertito i miei file in UTF-16, per qualche motivo. -Encoding UTF8non ha cambiato nulla.
John Dvorak,

5

Basta usare il comando dos copy con più file di origine e un file di destinazione.

copy file1+file2 appendedfile

Potrebbe essere necessaria l'opzione / B per i file binari


2

Nella versione Redstone 1 di Windows 10, Windows ha aggiunto un vero sottosistema Linux per il kernel NTOS. Penso che originariamente fosse destinato a supportare le app Android e forse gli scenari di tipo docker. Microsoft ha stretto una partnership con Canonical e ha aggiunto una vera shell bash nativa. Inoltre, è possibile utilizzare il gestore pacchetti apt per ottenere molti pacchetti Ubuntu. Ad esempio, puoi fare apt-get gcc per installare la catena di strumenti GCC come faresti su una scatola di Linux.

Se una cosa del genere esistesse mentre ero all'università, penso che avrei potuto svolgere la maggior parte dei miei incarichi di programmazione Unix nella bash shell nativa di Windows.


1

Se vuoi semplicemente aggiungere del testo alla fine del file esistente, puoi usare la >> pipe. ex:

echo new text >>existingFile.txt

0

Se devi usare uno script batch e hai installato python qui c'è una risposta poligota in batch e 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 salvato come join.bat l'utilizzo sarebbe:

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

Grazie anche questa risposta per l'ispirazione.


0

Provo a ricongiungermi con l'archivio tar che è stato diviso in un server Linux.

E ho scoperto che se lo uso typein Windows cmd.exe, il file verrà unito in ordine erratotype volte inserisce prima XXXX.ad e poi XXXX.ac, XXXX.aa ecc ...)

Quindi, ho trovato uno strumento chiamato batin GitHub https://github.com/sharkdp/bat che ha una build di Windows e ha una migliore evidenziazione del codice e l'importante è che funzioni bene su Windows per ricongiungersi all'archivio tar!


0

Quindi stavo cercando una soluzione simile con l'abilità di preservare i caratteri EOL e ho scoperto che non c'era modo, quindi faccio quello che faccio meglio e ho creato la mia utilità Questo è un eseguibile gatto nativo per 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 chiamo sharp-cat perché è costruito con C #, sentiti libero di scansionare con un antivirus e il codice sorgente sarà reso disponibile su richiesta


-1

Il comando di tipo Windows presenta problemi, ad esempio con caratteri Unicode sul limite di 512 byte. Prova il gatto di Cygwin.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.