Como faço para concatenar arquivos usando uma lista e lote?

0

Eu preciso do equivalente do comando shell xargs < list.txt cat -- > compiled.txt como um arquivo em lotes do Windows.

Existe um diretório cheio de arquivos de texto (cerca de 50 a 500 arquivos) que eu preciso concatenar em um arquivo. A ordem é importante. Os arquivos não podem ser nomeados em ordem asciibética, porque a ordem natural não é a ordem que deve ser compilada no arquivo de destino.

Eu tive a idéia de nomear os arquivos de origem como $DISREGARD1_$SECOND-ORDER_$FIRST-ORDER_$THIRD-ORDER_$DISREGARD2.txt e fazer um pouco de voodoo com ele, mas acho que para meu caso de uso é mais simples e menos volátil manter uma lista ordenada. Concatenar a partir de uma lista é muito fácil com xargs e cat. Como faço isso com um arquivo .bat no Windows?

Eu preciso disso como um arquivo em lote idempotente para que o usuário possa clicar nele. No arquivo de destino não deve haver nenhuma saída de comando, retornos de carro supérfluos ou qualquer outra coisa que não esteja nas fontes (ou seja, como se os arquivos fossem binários).

Pergunta bônus: seria ótimo permitir observações no arquivo da lista (linhas vazias não permitidas para limitar a complexidade). Eu faria isso com shell com sth. como grep -v ^# < list.txt | xargs cat -- > compiled.txt . Alguma chance de colocar isso em um arquivo .bat também?

    
por Johannes 16.06.2014 / 10:21

2 respostas

2

Isso deve ser feito:

@echo off
REM create empty result file
copy nul results.txt /y

REM iterate over list skipping #entries and copy binary
for /f "usebackq delims=" %%F in ('findstr /R /V "^#" list.txt') do (
 copy /b results.txt+"%%~F" results.txt 
)

Sintaxe como arquivo em lote, se você quiser executar diretamente da linha de cmd, altere %%F para %F

    
por 16.06.2014 / 13:54
2

Use um for loop :

@echo off

( for /f "tokens=*" %%i in (list.txt) do type "%%~i" ) > compiled.txt
    
por 16.06.2014 / 10:55