
Estou usando o 7-zip para fazer backup de pastas do meu disco em arquivos 7z em um armazenamento de rede. Cada vez que o script de backup for executado, ele atualizará os arquivos existentes no modo de atualização 7-zip (compacta novos arquivos do disco e copia os arquivos inalterados do arquivo antigo). Funciona bem, mas envolve duas transferências completas de cada arquivo pela rede.
Agora, muitas vezes o conteúdo da pasta não mudou desde a última tarefa de backup, então seria muito mais eficiente simplesmente pular toda a operação e deixar o arquivo antigo como está. Como posso conseguir isso?
Responder1
Adicionar a opção "-stl" define a data/hora dos arquivos para a do último arquivo modificado. Criei um arquivo de teste somente leitura e não recebi nenhum erro do 7zip quando "atualizei" quando nenhum arquivo foi alterado. Advertência: Quando a opção "-mhe=on" também é usada, então ocontentedo arquivoéalterado, mas apenas quando a atualização não ocorre no mesmo minuto da atualização anterior. Em outras palavras, "-mhe=on" sempre criptografa e armazena novamente os cabeçalhos e aparentemente usa o horário atual em minutos para isso.
Responder2
De acordo commanual, você deverá ser capaz de especificar uma combinação deestadoeAçãocom o-vocêmude para controlar com precisão em quais casos você deseja que o arquivo seja atualizado:
Como demonstra um exemplo, 7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=off
cria um novo arquivoatualização.7ze grava neste arquivo todos os arquivos do diretório atual que diferem dos arquivos noexiste.7zarquivo. Se você omitir o ! seguido pelo novo nome do arquivo, somente o arquivo base ou existente deverá ser atualizado se as condições especificadas forem atendidas.
Responder3
Estendi a resposta de Karan, preservando o horário da última modificação do arquivo de backup
O lote do Windows é muito limitado e só consegui fazer esse script funcionar usandoNirCmd- Ferramenta de linha de comando do Windows
Portanto, este é um script em lote que usa7-zipeNirCmdpara criar arquivos de backup ou atualizá-los somente se o diretório de origem for alterado, preservando a hora de modificação do arquivo, para evitar que outros programas detectem o arquivo como alterado, evitando assim uploads indesejados.
@ECHO OFF
SET BaseDir=c:\Users
SET BkpsDir=d:\Backup
IF NOT EXIST "7za.exe" GOTO ExitError
IF NOT EXIST "nircmd.exe" GOTO ExitError
SET TimeFile=%temp%\tmpCloneFileTimeFile.bkp
SET OutputFile=%temp%\tmpOutputFile.bkp
REM create a temporary file
copy /y NUL "%TimeFile%" 1>NUL
CALL :CompressDirIfChanged Public\Music PublicMusic.7z
CALL :CompressDirIfChanged Dragos\Favorites DragosFavorites.7z
DEL "%TimeFile%" /F /Q >nul 2>nul
DEL "%OutputFile%" /F /Q >nul 2>nul
ECHO.
ECHO SUCCESS
ECHO.
PAUSE
EXIT
goto:eof
REM call :CompressDirIfChanged sourceDirRelativeToBaseDir ArchiveName
:CompressDirIfChanged
SET BkpSrc="%~1"
SET ArchDest=%BkpsDir%\%~2
CD "%BaseDir%"
IF EXIST "%ArchDest%" (
nircmd.exe clonefiletime "%ArchDest%" "%TimeFile%"
7za.exe u -up1q0r2x1y2z1w2 -mx=9 "%ArchDest%" "%BkpSrc%" 1>"%OutputFile%"
IF errorlevel 1 GOTO ExitError
FINDSTR /bli /c:"Items to compress: 0" "%OutputFile%" && FINDSTR /bli /c:"Files read from disk: 0" "%OutputFile%" && (
ECHO - no changes in %BkpSrc%, restoring Last Modified Time
nircmd.exe clonefiletime "%TimeFile%" "%ArchDest%"
) || (
ECHO - updating %ArchDest%
)
) ELSE (
ECHO - creating %ArchDest%
7za.exe a -aoa -mx=9 "%ArchDest%" "%BkpSrc%" 1>nul
IF errorlevel 1 GOTO ExitError
)
goto:eof
:ExitError
ECHO ERROR!
PAUSE
EXIT 1
goto:eof