如何使用 7z 命令归档 5 天前的文件

如何使用 7z 命令归档 5 天前的文件
REM Exclude file types for archiving
REM set EXCLUDE_FILES_TYPES=-x!*.rar -x!*.zip -x!*.7z
set EXCLUDE_FILES_TYPES=-xr!*.zip 

REM Delete files after archiving
set DELETE_AFTER_ARCHIVE=-sdel

REM Archive files only older then days
REM set ARCHIVE_FILE_OLDER_THEN=-to5d
set ARCHIVE_FILE_OLDER_THEN=-5

set EXTRA_PARAM=%EXCLUDE_FILES_TYPES% %DELETE_AFTER_ARCHIVE% %ARCHIVE_FILE_OLDER_THEN%


REM ------------------------------------------------------------------------------------


REM Path to WinRAR executable in Program Files
set path="C:\Program Files\7-Zip";%path%
REM $Env:Path = $Env:Path + ";C:\Program Files\7-Zip"

REM Set your WinRAR installation path for local testing
REM set path="C:\Program Files\7-Zip";%path%


REM Replace space in hour with zero if it's less than 10
SET hr=%time:~0,2%
IF %hr% lss 10 SET hr=0%hr:~1,1%

REM This sets the date like this: mm-dd-yr-hrminsecs1/100secs
Set TODAY=%date:~4,2%-%date:~7,2%-%date:~10,4%-%hr%%time:~3,2%%time:~6,2%%time:~9,2%


IF EXIST %EDI832_US_ARCHIVE_DIR% (
    cd %EDI832_US_ARCHIVE_DIR%
    7z a "%EDI832_US_FILE%_%TODAY%" %EXTRA_PARAM%

答案1

如何使用 7-Zip 存档超过 5 天的文件?

不幸的是,7-Zip 目前没有按年龄/日期过滤文件的选项(据我所知)。

然而,基于关联@DavidPostill 在评论中建议使用 Windows福尔菲斯实用程序,您可能能够使用类似以下内容的内容:

@REM Set the file list name used with 7-Zip
set FILE_LIST=file_list.txt

    if exist %EDI832_US_ARCHIVE_DIR% (

        cd %EDI832_US_ARCHIVE_DIR%

        @REM 7z a %EDI832_US_FILE%_%TODAY% %EXTRA_PARAM%

        @REM forfiles /s /m *.* /d -5 /c "cmd /v /c set newpath=@RELPATH && echo !newpath:.\=!" > file_list.txt
        forfiles /s /m *.* /d %ARCHIVE_FILE_OLDER_THEN% /c "cmd /v /c set newpath=@RELPATH && echo !newpath:.\=!" > %FILE_LIST%

        @REM 7z a %EDI832_US_FILE%_%TODAY% %EXTRA_PARAM% @file_list.txt
        7z a %EDI832_US_FILE%_%TODAY% %EXTRA_PARAM% @%FILE_LIST%

        @REM del file_list.txt
        @REM del %FILE_LIST%

        )

在这种情况下,上述示例应生成超过 5 天的forfiles文件列表 ( ),并采用以下格式为每个文件提供完整路径:> file_list.txt

"filename.ext" 
"subfolder\filename.ext"

然后可以将其传递给 7zip 作为例子@file_list.txt


forfiles 示例命令

分解示例forfiles 命令选项

  • /s表示递归子目录。

  • /m是文件掩码(在此示例中,这包括通过 的所有文件和扩展名*.*)。

  • /d设置要包含/排除的文件的年龄(基于文件的最后修改日期)。上面的示例将包括超过 5 天的文件(-5)。当前日期包含在计算中,因此最多可计算 4 天前的文件不是考虑(即不会添加到此列表中)。

  • /c指定对每个文件运行的命令。该命令:

    cmd /v /c set newpath=@RELPATH && echo !newpath:.\=!
    

    工作原理如下:

    • cmd /v /c运行一个新实例命令(Windows 命令提示符)延迟扩张启用( )并在完成命令后立即/v关闭该实例( )。cmd/c

    • set newpath=@RELPATH创建一个名为的临时变量newpath并将其设置为值@RELPATH。是通过以下形式@RELPATH自动创建的文件的相对路径,例如“\filename.ext”(其中表示当前文件夹)。forfiles.\

    • echo !newpath:.\=!打印 的修改版本newpath:.\=!附加的部分newpath实际上是 DOS 字符串变量操作,表示用.\空值替换 的所有实例(=)。当启用延迟扩展时,!符号用于代替 来引用变量(例如而不是)。%!newpath!%newpath%

    • &&只是允许将上面的两个单独的set命令echo放置/执行在一行上。


笔记

  • newpath可以任意称呼。

  • 即使使用文件列表, 7-Zip 也应该尊重 7-Zip-x及其选项。-sdel

  • 在一行中设置/使用变量的命令改编自对这个超级用户问题

注意事项

  • .\需要从传递给 7-Zip 的相对路径中删除,以保持相对目录结构。否则,保留.\会导致 7-Zip 将所有压缩文件放在存档的根目录中(即没有子文件夹),从而“扁平化”所有内容。

  • 当从 生成的列表中读取时forfiles,某些字符差异可能会导致 7-Zip 跳过文件。例如,在文件名中使用而不是'可能会导致“文件未找到”警告(因此这些文件不会添加到给定的存档中)。

  • 使用cmd /cwithforfiles会增加处理每个文件的开销(与不直接运行命令相比cmd),但是绕过命令可能失败的任何潜在错误

  • /c "cmd /c [...]"必须使用双引号,以免forfiles出现使用两次的抱怨/c

  • 上面有超级用户问题链接注意到使用cmd /c /v(而不是cmd /v /c)可能会不是工作。

  • 给出的命令forfiles已在 Windows 7 上测试过。但是,在已经链接的同一个超级用户问题中,一条评论报告了在 Windows 10(版本 1607)上组合类似命令时出现的问题,显然是由于尾随空格造成的。

  • 在上下文中,上面提到的“尾随空格”问题似乎不太可能与此相关,但如果是这样,您可以尝试使用“内部引号”(如链接问题中所建议的)或直接使用"cmd /c echo @RELPATH"forfiles使用另一个命令行实用程序清除.\(以及任何其他不需要的字符)的每一行file_list.txt

  • 您可以使用将文件单独添加到存档中forfiles(绕过例如的需要file_list.txt),但这是一个很多速度较慢(相对而言),因为通常需要为添加的每个文件反复解压缩/重新压缩档案。

答案2

/d %存档文件_OLDER_THEN%
/d -%存档文件_OLDER_THEN%

相关内容