我正在尝试创建一个批处理脚本,该脚本将压缩每个子目录中除最新(或最近几个)之外的所有内容。我目前正在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和dir
set(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] 删除。
我来说两句