Linha de Comando: Concatena vários arquivos por data

3

Eu tenho muitos arquivos .txt em um diretório. O diretório também contém arquivos .png e alguns arquivos .pdf. Eu concatenei com êxito arquivos .txt usando este comando:

@ECHO Off
SETLOCAL
for /r %%f in (*.txt) do (
echo.
type "%%f"
)>> output.doc

GOTO :EOF

O comando acima foi obtido de um dos sites online. Este comando irá concatenar arquivos .txt em ordem alfabética. Mas eu não quero assim, eu quero que seja feito pela data modificada ou criada (modificado é recomendado). Eu tenho uma dica de que a linha

for /r %%f in(*.txt) do ( 

deve ser modificado para concatenar por data.Eu sou novo nesta linha de comando ou em lote de scripts, então eu realmente não sei muito sobre isso. Como devo fazer isso? Obrigado a todos pelas respostas.

Desculpe por não incluir essa pergunta na primeira vez. Eu tenho mais um requisito com base em outra pergunta que eu perguntei anteriormente ( Pergunta ) eu tenho um arquivo em lotes para concatenar arquivos .txt e para adicionar duas linhas no topo de cada arquivo (um para escrever o nome do arquivo sem a extensão e outro para escrever a data associada ao arquivo concatenado). modifique o arquivo de lote abaixo para concatenar arquivos .txt pela ordem de data de modificação e para adicionar as duas linhas no topo de cada arquivo.

@echo off
SETLOCAL
for /r %%f in (*.txt) do (
echo File Name   : %%~nf 
FOR /f %%d IN ("%%~tf") DO echo Date        : %%d
echo.
type "%%f"
) >> output_text.doc

GOTO :EOF

Todos os problemas foram resolvidos com o arquivo de lote final:

@echo off
setlocal enableextensions disabledelayedexpansion

set "root=%cd%"

>"output.doc" (
    for /f "tokens=1,2,*" %%a in ('
        robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
        ^| sort 
    ') do (
     echo( %%~nc
     for /f "tokens=1-3 delims=/" %%d in ("%%a") do echo %%f/%%e/%%d
     type "%%~fc"
    )
)
    
por CodeIt 12.04.2015 / 07:37

3 respostas

1
@echo off
    setlocal enableextensions disabledelayedexpansion

    set "root=%cd%"

    >"output.doc" (
        for /f "tokens=2,*" %%a in ('
            robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
            ^| sort 
        ') do type "%%~fb"
    )

Isso usará robocopy para obter a lista de todos os arquivos .txt na pasta raiz indicada.

A lista de arquivos é gerada, incluindo a data da última modificação dos arquivos. robocopy imprime a hora UTC em yyyy/mm/dd hh:mm:ss format, portanto, a lista pode ser classificada corretamente.

O restante do código é apenas um comando for /f para processar a lista final, recuperando a referência do arquivo e digitando-a. O comando completo é redirecionado para o arquivo de saída para evitar a operação de abertura / fechamento de cada arquivo processado.

editado como é necessário para incluir o nome do arquivo e o registro de data e hora na saída final ...

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "root=%cd%"

    >"output.doc" (
        for /f "tokens=1,2,*" %%a in ('
            robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
            ^| sort 
        ') do (
            echo(%%~nc
            echo(%%a %%b [%%~tc]
            type "%%~fc"
        )
    )

A cláusula tokens foi alterada para recuperar o registro de data e hora de robocopy , para que possamos incluí-lo na saída. %%a manterá a data, %%b a hora e %%c o nome do arquivo com o caminho completo.

Para cada arquivo, primeiro é ecoado o nome do arquivo sem extensão ( %%~nc ), depois o% time stamp robocopy e, apenas para comparar como a saída do robocopy é uma hora UTC, o timestamp do arquivo ( %%~tc ). Então o arquivo é digitado.

Como antes, toda a saída é redirecionada para o arquivo final.

    
por 13.04.2015 / 08:03
1

Powershell (3 - observe) um revestimento:

gci *.txt -Recurse -File |sort -Property LastWriteTime |% {(gc $_) + "'n"} >output.doc

  • Primeiro, lista todos os arquivos correspondentes ( gci )
  • classifica-os por data de modificação ( sort )
  • , em seguida, obtém o conteúdo do arquivo e acrescenta uma nova linha a cada um ( gc )
  • e finalmente grava tudo no arquivo de saída.

Observação: porque ele usa -File , que foi introduzido no ps3. Isso pode ser reescrito na sintaxe do Ps2, mas é mais detalhado.

Editar: conforme solicitado pelo OP: modificar {(gc $ _) + "'n"} para ler:

{"$($_.basename)'n$(get-date -u %d/%m/%Y $_.lastwritetime)'n$(gc $_)'n"}

(interpolação de string usada desta vez para mostrar várias opções)

Nota: [possível] inconsistências na codificação de arquivos & problemas não tratados.

por 13.04.2015 / 10:54
1
for /f "delims=:" %f in ('dir *.txt /O:D /T:W /B') do @echo %f

Este comando usará dir para classificar a data mais antiga para a mais recente ( /O:D ) usando a última data escrita ( /T:W ) e o formato simples ( /B ) para retornar os nomes dos arquivos. A definição de delims para : no comando for evita que ele tente analisar o nome do arquivo com base em espaços ou vírgulas, pois : não é permitido em um nome de arquivo.

    
por 23.03.2017 / 21:58