
Estoy usando 7-zip para hacer copias de seguridad de carpetas de mi disco en archivos 7z en un almacenamiento de red. Cada vez que se ejecuta el script de copia de seguridad, actualizará los archivos existentes en el modo de actualización 7-zip (comprimirá los archivos nuevos del disco y copiará los archivos sin cambios del archivo antiguo). Funciona bien pero implica dos transferencias completas de cada archivo a través de la red.
Ahora bien, a menudo el contenido de la carpeta no ha cambiado en absoluto desde el último trabajo de copia de seguridad, por lo que sería mucho más eficiente omitir toda la operación y dejar el archivo antiguo como está. ¿Cómo puedo conseguir esto?
Respuesta1
Agregar la opción "-stl" establece la fecha/hora del archivo comprimido a la del último archivo modificado. Hice un archivo de prueba de solo lectura y no obtuve ningún error de 7zip cuando "actualicé" cuando no se cambiaron archivos. Advertencia: Cuando también se utiliza la opción "-mhe=on", entonces elcontenidodel archivoescambiado, pero solo cuando la actualización no ocurre en el mismo minuto que la actualización anterior. En otras palabras, "-mhe=on" siempre vuelve a cifrar y restaurar los encabezados y aparentemente usa la hora actual en minutos para eso.
Respuesta2
De acuerdo con lamanual, debería poder especificar una combinación deestadoyaccióncon el-túcambie para controlar con precisión en qué casos desea que se actualice el archivo:
Como lo demuestra un ejemplo,7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=off
crea un nuevo archivo.actualización.7zy escribe en este archivo todos los archivos del directorio actual que difieren de los archivos en elexistir.7zarchivo. Si omites el ! seguido del nuevo nombre del archivo, entonces solo el archivo base o existente debe actualizarse si se cumplen las condiciones especificadas.
Respuesta3
Extendí la respuesta de Karan, conservando al mismo tiempo el archivo de copia de seguridad de la última vez que se modificó.
El lote de Windows es muy limitado y solo pude hacer que este script funcione usandoNirCmd- Herramienta de línea de comandos de Windows
Entonces este es un script por lotes que usa7 cremallerasyNirCmdpara crear archivos de respaldo o actualizarlos solo si se cambió el directorio de origen, preservando al mismo tiempo el tiempo de modificación del archivo, para evitar que otros programas detecten el archivo como modificado, evitando así cargas no deseadas.
@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