7-zip 업데이트: 변경된 사항이 없으면 작업 건너뛰기

7-zip 업데이트: 변경된 사항이 없으면 작업 건너뛰기

7-zip을 사용하여 내 디스크의 폴더를 네트워크 저장소의 7z 아카이브로 백업하고 있습니다. 백업 스크립트가 실행될 때마다 7-zip 업데이트 모드로 기존 아카이브를 업데이트합니다(디스크에서 새 파일을 압축하고 이전 아카이브에서 변경되지 않은 파일 복사). 잘 작동하지만 네트워크를 통해 각 아카이브를 두 번 완전히 전송해야 합니다.

이제는 마지막 백업 작업 이후 폴더 내용이 전혀 변경되지 않은 경우가 많으므로 전체 작업을 건너뛰고 이전 아카이브를 그대로 두는 것이 훨씬 더 효율적입니다. 어떻게 이를 달성할 수 있나요?

답변1

"-stl" 옵션을 추가하면 아카이브 날짜/시간이 마지막으로 수정된 파일의 날짜/시간으로 설정됩니다. 테스트 아카이브를 읽기 전용으로 만들었고 파일이 변경되지 않았을 때 "업데이트"할 때 7zip에서 오류가 발생하지 않았습니다. 주의 사항: "-mhe=on" 옵션도 사용하면콘텐츠아카이브의~이다변경되지만 이전 업데이트와 동일한 시간에 업데이트가 발생하지 않는 경우에만 해당됩니다. 즉, "-mhe=on"은 항상 헤더를 다시 암호화하고 다시 저장하며 현재 시간을 분 단위로 사용합니다.

답변2

에 따르면수동, 다음의 조합을 지정할 수 있어야 합니다.상태그리고행동와 더불어-유아카이브를 업데이트하려는 경우를 정확하게 제어하도록 전환하십시오.

1

예에서 알 수 있듯이 7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=off새 아카이브를 생성합니다 .업데이트.7z현재 디렉토리의 파일 중 현재 디렉토리의 파일과 다른 모든 파일을 이 아카이브에 기록합니다.존재합니다.7z보관소. 을 생략하면! 그 뒤에 새 아카이브 이름이 오면 지정된 조건이 충족되면 기본 또는 기존 아카이브만 업데이트되어야 합니다.

답변3

백업 아카이브를 마지막으로 수정한 시간을 유지하면서 Karan의 답변을 확장했습니다.

Windows 배치는 매우 제한되어 있으므로 다음을 사용해야만 이 스크립트를 작동시킬 수 있습니다.NirCmd- Windows 명령줄 도구

따라서 이것은 다음을 사용하는 배치 스크립트입니다.7-zip그리고NirCmd백업 아카이브를 생성하거나 원본 디렉토리가 변경된 경우에만 업데이트하고 아카이브 수정 시간을 보존하여 다른 프로그램이 아카이브가 변경된 것으로 감지하지 못하도록 하여 원치 않는 업로드를 방지합니다.

@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

관련 정보