Copiando apenas arquivos mais recentes de uma pasta para outra

7

Eu tenho 2 pastas com arquivos. Esses arquivos são o produto de algum processo de criação. A primeira pasta são as saídas de compilação anterior , enquanto a última é a saída da compilação atual .

Eu gostaria de, de alguma forma, diferenciar essas duas pastas do script de linha de comando / build e copiar somente arquivos que foram adicionados ou arquivos que são novos em alguma outra pasta.

Por exemplo:

**FOLDER1** (new build)
a.txt
b.txt (modified)
c.txt
d.txt

**FOLDER2** (prev build)
a.txt
b.txt
c.txt

Com base nisso, a operação de cópia em que estou interessado copiará apenas b.txt e d.txt em outra pasta (não na pasta2).

Basicamente, eu sou apenas após os "deltas" e gostaria de armazená-los em algum lugar.

Isso é possível usando ferramentas de linha de comando padrão que vêm com o Windows? (suponha que o Windows 7 / Server 2008 ou superior)

    
por liortal 17.12.2012 / 15:54

2 respostas

9

Use XCOPY com as opções / D e / L, "copiando" da pasta 1 para a pasta 2.

A opção / D restringe a cópia apenas aos arquivos novos ou modificados.

A opção / L faz com que o comando liste os arquivos que seriam copiados, mas impede que quaisquer cópias sejam realmente feitas.

Em seguida, use FOR / F para processar esses resultados e copie os arquivos para a pasta 3.

for /f "eol=: delims=" %F in ('xcopy /dl "folder1\*" "folder2"') do @copy "%F" "f3" >nul

Se colocar em um arquivo de lote, todo % deve ser dobrado como %% .

O XCOPY também imprime um resumo de quantos arquivos são (seriam) afetados. O acima tentará copiar um arquivo com a contagem de resumo "name" e, é claro, falhará. O redirecionamento da saída para nul impede que a mensagem de erro seja exibida. Eu testei no Windows 7 e fiquei surpreso com a mensagem de erro no stdout e não no stderr. Se a mensagem de erro em outras versões estiver aparecendo no stderr, o comando também deverá receber 2 > nul para evitar a mensagem de erro.

Mas há um risco em esconder as mensagens de erro - e se uma cópia falhar por algum motivo?

Aqui está um script que listará todos os arquivos que foram copiados com sucesso, além de indicar quais (se houver) falharam. Ele usa FINDSTR para filtrar a contagem de arquivos indesejados. Ele assume que a contagem de arquivos está em inglês, com o formato NNN File(s) , portanto, teria que ser modificado para outros idiomas.

@echo off
for /f "eol=: delims=" %%F in (
  'xcopy /dl "folder1\*" "folder2" ^| findstr /v "^[0-9][0-9]* File(s)"'
) do copy "%%F" "folder3" >nul && echo "%%F"|| echo FAILED: "%%f"

Aqui está uma variante mais complexa que funciona com qualquer idioma. Ele salva cada nome de arquivo em uma variável e atrasa a cópia até a próxima iteração do loop. A última entrada (a contagem) nunca é copiada.

@echo off
setlocal disableDelayedExpansion
set "file="
for /f "eol=: delims=" %%F in ('xcopy /dl "folder1\*" "folder2"') do (
  if defined file (
    setlocal enableDelayedExpansion
    copy "!file!" "folder3" >nul && echo "!file!" || echo FAILED: "!file!"
    endlocal
  )
  set "file=%%F"
)
    
por 18.12.2012 / 00:08
0

Eu gosto do ROBOCOPY em vez disso. Usado XCOPY por anos, em seguida, encontrou a necessidade de uma operação de cópia reinicializável através de uma conexão com a internet lenta / twitchy.

ROBOCOPY src dest / s / e / xo

ou espelho

ROBOCOPY src dest / mir

Use as opções de registro para obter sua lista para análise posterior.

ROBOCOPY src dest / s / e / xo / log: arquivo

    
por 21.04.2018 / 05:45