如何将所有文件(文件夹中每个子文件夹中的最新文件除外)压缩到每个子文件夹一个ZIP文件中?

溜冰者

我正在尝试创建一个批处理脚本,该脚本将压缩每个子目录中除最新(或最近几个)之外的所有内容。我目前正在Windows中使用7-Zip进行尝试,但是从技术上讲,该目录位于Linux服务器上,因此欢迎针对Linux命令的任何建议。

目录结构是这样的:

Directory-Parent
 ---Sub-Directory-1
 --------File1
 --------File2
 --------File3
 ---Sub-Directory-2
 --------File1
 --------File2

我想在Directory-Parent将在所有文件的每个子目录中创建一个zip级别上运行一个批处理,但最新的文件除外(如果可能的话,则为几个)。我还想在zip文件名的末尾添加年份。

因此结果将是:

Directory-Parent
 -Sub-Directory-1
 --------File1
 --------Sub-Directory-12019.zip
 ---Sub-Directory-2
 --------File1
 --------Sub-Directory-22019.zip

我已经尝试过嵌套for循环,但似乎无法理解。我已经尝试过for使用skip和dirset(IN)命令,但是无法使其正常工作。

我目前有以下脚本。

SET theYear=2019
For /D %%d in (*.*) do 7z a "%%d\%%d%theYear%.zip" ".\%%d\*"

除了我不知道如何在每个文件夹中排除最新文件(根据上次修改时间的最新文件)之外,这一切都完成了。

莫菲

此批处理文件可用于此任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FilesToIgnore=1"
set "theYear=%DATE:~-4%"
set "ListFile=%Temp%\%~n0.lst"
del "%ListFile%" 2>nul
for /D %%I in (*) do call :CompressFiles "%%I"
goto EndBatch

:CompressFiles
pushd %1
set "ZipFile=%~nx1%theYear%.zip"
for /F "skip=%FilesToIgnore% eol=| delims=" %%J in ('dir /A-D /B /O-D /TW 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /L /V /X /C:"%ZipFile%"') do >>"%ListFile%" echo %%J
if exist "%ListFile%" (
    echo Compressing files in directory %1 ...
    7z.exe a -bd -bso0 -i"@%ListFile%" -mx9 -scsDOS -- "%ZipFile%"
    del "%ListFile%"
)
popd
goto :EOF

:EndBatch
endlocal

批处理文件theYear从动态环境变量的区域相关日期字符串动态设置环境变量DATE请在命令提示符窗口中执行,echo %DATE:~-4%并验证输出是否为当前年份,因为echo %DATE%输出的是当前本地日期,最后四个字符为年份。

批处理文件将忽略FilesToIgnore每个目录中最新文件。如果该批处理文件的先前执行中已存在该ZIP文件,则也将被忽略。ZIP文件从不包含在数量中,FilesToIgnore因为已经过滤掉了findstr该命令的dir输出,该命令输出的文件名在上次修改时间之前按当前目录排序,而最新目录优先输出,最新文件最后输出。

请阅读7-Zip的帮助以了解所使用的开关和参数。

为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • popd /?
  • pushd /?
  • set /?
  • setlocal /?

阅读有关使用命令重定向运算符的Microsoft文章,获取有关2>nul的说明|当Windows命令解释器在执行命令FOR之前,Windows命令解释器处理此命令行时,重定向操作符>|必须^FOR命令行使用脱字符号转义为文字字符,该命令在后台启动的单独命令进程中执行嵌入式命令行。

更新: 7-Zip版本19.00.0.0将输出警告,并使用如下所述的命令行在每个子目录中创建一个空的ZIP文件,并最初在批处理文件中使用。我首先认为这是7-Zip版本19.00.0.0的错误,因为此版本也应--根据其帮助来支持,并且7-Zip版本16.04.0.0可以在命令行中使用:

7z.exe a -bd -bso0 -mx9 -scsDOS -- "%ZipFile%" "@%ListFile%"

必须--从此命令行中删除它才能使其与7-Zip版本19.00.0.0一起使用。

因此,我报告了此问题,并且7-Zip的作者迅速回答,解释了为什么7-Zip版本19.00.0.0--起,@搜索以文件名开头的文件时使用结果的原因:

我们需要一些从命令行添加@file-file命名的方法
因此--停止@并进行-解析,然后7-Zip搜索确切名称。
而是更安全地使用-i@listfile

因此,我更新了批处理文件代码,并使用选项指定了列表文件,-i这是指定列表文件的最安全方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章