7-zip update: ignora a operação se nada tiver mudado

1

Estou usando o 7-zip para backup de pastas no 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 do 7-zip (comprimir novos arquivos do disco e copiar 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, portanto, seria muito mais eficiente simplesmente pular toda a operação e deixar o arquivo antigo como está. Como posso conseguir isso?

    
por Theo Tiger 20.04.2015 / 11:52

3 respostas

1

De acordo com o manual , você deve ser capaz de especificar uma combinação de state e action com o comutador -u para controlar com precisão em quais casos você deseja que o arquivo seja atualizado:

Como um exemplo demonstra, 7z u c:\exist.7z -up0q3x2z0!c:\update.7z * -ms=off cria um novo arquivo update.7z e grava neste arquivo todos os arquivos do diretório atual que diferem dos arquivos em exist.7z arquivo. Se você omitir o! seguido pelo novo nome do arquivo, somente a base ou o arquivo existente deve ser atualizado se as condições especificadas forem atendidas.

    
por 20.04.2015 / 13:00
0

Eu estendi a resposta de Karan, preservando o tempo de última modificação do arquivo de backup

O lote do Windows é muito limitado, e eu só poderia fazer esse script funcionar usando NirCmd - linha de comando do Windows ferramenta

Portanto, este é um script em lote que usa 7-zip e NirCmd para criar arquivos de backup ou atualizá-los somente se o diretório de origem foi alterado, preservando o tempo de arquivamento modificado, para impedir que outros programas detectem o arquivo como alterado, evitando assim uploads ..

@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
    
por 17.01.2018 / 13:40
0

A adição da opção "-stl" configura a data / hora dos arquivos para a do último arquivo modificado. Fiz 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" é usada também, então o conteúdo do arquivo é alterado, mas somente quando a atualização não ocorre no mesmo minuto como a atualização anterior. Em outras palavras, o "-mhe = on" sempre criptografa novamente e armazena os cabeçalhos e, aparentemente, usa o tempo atual em minutos para isso.

    
por 07.07.2018 / 14:37