![如何在 7zip 中为每个选定的文件/目录创建单独的 zip 文件?](https://linux22.com/image/1283409/%E5%A6%82%E4%BD%95%E5%9C%A8%207zip%20%E4%B8%AD%E4%B8%BA%E6%AF%8F%E4%B8%AA%E9%80%89%E5%AE%9A%E7%9A%84%E6%96%87%E4%BB%B6%2F%E7%9B%AE%E5%BD%95%E5%88%9B%E5%BB%BA%E5%8D%95%E7%8B%AC%E7%9A%84%20zip%20%E6%96%87%E4%BB%B6%EF%BC%9F.png)
这是 Total Commander 的内部 zip 打包程序:
但是我想使用 7zip 打包器。当我选择 5 个文件时,每个选定文件都会得到 5 个单独的 .zip 档案。如何在 7zip 中做到这一点?
答案1
我不确定您是否可以使用图形用户界面执行您所建议的操作,但您当然可以通过命令行执行此操作:
FOR %i IN (*.*) DO 7z.exe a "%~ni.7z" "%i"
您需要先将目录(命令cd
)更改为F:\Downloads
目录,或者您想要执行批量压缩的任何目录。此外,替换为 *.exe 或您想要过滤的任何扩展名也很容易,只需压缩这些文档即可。
还有秘密解码环:
%i
是一个变量,用于保存循环中每一步的文件名(*.*)
是选择标准,它很容易是 *.exe 或类似的7z.exe
是 7-Zip 的命令行版本%~ni
- 这会将 %i 变量扩展为文件名 - 没有扩展名
如果您只想添加给定目录的文件夹,则命令会稍微复杂一些,因为默认情况下 FOR 仅适用于文件。我们需要向它提供一些其他信息:
FOR /F "usebackq delims=?" %i IN (`DIR /B /A:D`) DO 7z.exe a "%i.7z" "%i"
这项技术之所以能成功,是因为一些看似神奇的东西:
/F
告诉 FOR 迭代 () 中的扩展值usebackq
告诉 FOR 我将传递一个命令并使用输出进行迭代delims=?
告诉 FOR 我想要将标记拆分为?
- 文件名和目录中的非法字符。我只想要一个标记。- in
/B
是DIR
为了裸格式- 只是名字 - in
/A:D
表示DIR
按属性限制结果,D 表示目录
如果您想将其封装在批处理文件中,唯一需要做的更改是对 %i 变量进行双重转义:
FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
答案2
我喜欢 Goyuix 的回答。但是,如果您使用的是 Windows 7(或安装了 Power Shell),并且还使用 7-zip 的命令行版本 7za.exe,那么您可以运行以下命令:
dir | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }
您还可以将“dir”更改为“dir *.exe”以仅选择可执行文件。
Power Shell 的一个优点是,你处理的是对象而不是字符串。因此,如果你愿意,你可以获得非常具体的信息。例如:
dir *.csv | ? { $_.Length -lt 18900 -and $_.LastWriteTime -ge [DateTime] "07/01/2011" } | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }
这将仅包含以下文件:
- 具有 csv 扩展名
- 大小小于 18,900 字节
- 最后修改于 2011 年 7 月 1 日或之后
编辑 如果你想要 zip 文件而不是 7-zip 文件,请使用InfoZip 的 zip.exe反而。
答案3
我刚刚一直在研究这个问题,我发现的问题之一是档案中的文件夹名称重复,即当压缩名为“foo”的文件夹时,.\foo\fighters.txt
会生成一个包含的档案,而不仅仅是一个包含的档案fighters.txt
。
因此,答案是进入正在处理的目录并让档案出现在前一个(根)目录中,然后返回该目录以处理下一个文件夹。
让 7ZIP 忽略根目录中现有的 ZIP 和 CMD 文件也很重要,以防止它们最终进入存档中,因此需要-x!*.zip
排除-x!*.cmd
参数。
该脚本还将维护递归文件夹结构。
@echo off
REM Ensures variables set within the batch file are local to
REM this script only and will be removed when finished.
setlocal
if exist *.zip goto zip_exist
for /d %%X in (*) do (
cls
cd /D %%X
"e:\Program Files\7-Zip\7z.exe" a -r -x!*.zip -x!*.cmd "..\%%X.zip" "*.*"
cd ..
)
goto end
:zip_exist
Echo.
Echo Note: for this script to work, compression of
Echo pre-existing zip files is not possible.
:end
pause
应将上述代码复制到批处理文件(例如“compress_dirs.cmd”)并以管理员身份从包含要压缩的文件夹的目录运行。
希望这可以帮助。
答案4
您可以从以下位置下载并安装 Total Commander 的 7zip 插件http://www.ghisler.com/plugins.htm 执行此操作后,在屏幕截图的窗口右侧会出现另一个 7zip 压缩选项。使用该选项,您可以实现所需的目的。