7zip命令行使用简略手册
2013-07-17 14:33:16

7-zip应该是目前最好的跨平台使用的开源文档处理压缩软件了,在多数情况下,可以通过gui界面对其进行操作;但在某些情况下,确要使用命令行模式,本文就其在命令行使用的方法做一简单介绍。

参考手册(涵盖了它的方方面面,主要是对其的命令行使用方面,基本上是英文的,非常值得参考):
https://sevenzip.osdn.jp/chm/start.htm
https://7zip.bugaco.com/7zip/MANUAL/
https://documentation.help/7-Zip-18.0/start.htm

命令行手册


7z|7za 子命令 [选项] 压缩包 [文件]
子命令

a    添加
d    删除
e    解压
x    带路径解压
l    列表查看
t    测试
u    更新
h    计算并取得文件的Hash校验和

选项

 -m 压缩方式    
-m0=压缩算法    默认使用 lzma
-mx=数字    1~9 压缩级别
-mfb=64    number of fast bytes for LZMA = 64
-md=字典大小    设置字典大小,例如 -md=32m
-ms=on|off    是否固实压缩

-o输出目录    设置输出目录
-p密码    使用密码
-r数字    递归,使用数字定义递归子目录的深度
-sfx[模块名称]    使用自解压模块
-si    从标准输入设备读入数据
-so    将数据写入标准输出设备
-y    所有询问均回答 Yes
-w路径    设置工作目录


用法
7za <命令> [<参数开关>...] <档案名称> [<文件名称>|<@列表文件...>]
在方括号内的表达式(“[” 和 “]”之间的字符)是可选的。在书名号内的表达式(“<” 和 “>”之间的字符)是必须替换的表达式(而且要去掉括号)。

7-Zip 支持和 Windows 相类似的通配符:
“*”可以使用星号代替零个或多个字符。
“?”可以用问号代替名称中的单个字符。
如果只用*,7-Zip 会将其视为任何扩展名的全部文件。

命令
a: 添加到压缩文件

b: 基准测试

d: 从档案中删除文件

e: 解压档案文件 (无目录名称)

l: 列出压缩文件内容

t: 测试压缩文件的完整性

u: 更新文件到压缩文件中

x: 完整路径下解压文件

x: 计算外部文件或7z包中的文件Hash校验和


参数开关
-ai[r[-|0]]{@列表文件|!通配符}: 包括 压缩文件

-ax[r[-|0]]{@列表文件|!通配符}: 排除 压缩文件

-bd: 禁用百分比显示功能

-i[r[-|0]]{@列表文件|!通配符}: 包括 文件名称

-m{参数}: 设置压缩算法

-o{目录}: 设置输出目录

-p{密码}: 设置密码

-r[数字]: 递归子目录,使用数字定义递归子目录的深度

-scs{UTF-8 | WIN | DOS}: 设置列表文件的编码格式

-sfx[{名称}]: 创建 SFX 自解压文件

-si[{名称}]: 从stdin(标准输入设备)读取数据

-slt: 为 l (列表) 命令显示技术信息

-so: 将数据写入stdout(标准输出设备)

-ssc[-]: 设置大小写区分模式

-ssw: 压缩共享文件

-t{类型}: 设置压缩文件格式,(7z, zip, gzip, bzip2 or tar. 7z是默认的格式)

-v{大小}[b|k|m|g]: 分卷压缩

-u[-][p#][q#][r#][x#][y#][z#][!新建档案_名称]: 更新选项

-w[{路径}]: 指定工作目录,路径为空时代表临时文件夹目录

-x[r[-|0]]]{@列表文件|!通配符}: 排除 文件名称

-y: 所有询问选是

使用'-m'参数,即设置压缩算法时,有许多选项可以进行设置。

-m<压缩方式>,关于它有许多参数及指令,这里仅介绍简单且常用的用法。
-m0=<压缩算法> 默认使用 lzma

-md=<字典大小> 设置字典大小,例如 -md=32m

-mfb=64 number of fast bytes for LZMA = 64

-ms=<on|off> 是否固实压缩

-mx=<1~9> 压缩级别

更多关于'-m'参数的使用,请参考此处

退出代码
0 :正常,没有错误

1 :警告,没有致命的错误,例如某些文件正在被使用,没有被压缩

2 :致命错误

7 :命令行错误

8 :没有足够的内存

255 :用户中止了操作

命令示例

a 添加文件到压缩档案
7z a archive1.zip subdir\ :增加subdir文件夹下的所有的文件和子文件夹到archive1.zip中,archived1.zip中的文件名包含subdir\前缀。

7z a archive2.zip .\subdir\* :增加subdir文件夹下的所有的文件和子文件夹到archive1.zip中,archived2.zip中的文件名不包含subdir\前缀。

cd /D c:\dir1\
7z a c:\archive3.zip dir2\dir3\ :archiive3.zip中的文件名将包含dir2\dir3\前缀,但是不包含c:\dir1前缀。

7z a Files.7z *.txt -r : 增加当前文件夹及其子文件夹下的所有的txt文件到Files.7z中。

b 测试 CPU 运行速度及检查内存错误

d 从压缩档案删除文件
7z d freeoarch.7z *.bak -r :从freeoarch.7z中删除所有的bak文件。

e 从压缩档案中释放文件到当前目录中,或者到指定的输出文件夹。输出文件夹设置可以通过 -o (设置输出文件夹)选项来更改,此命令会将所有被释放的文件放置到一个文件夹。如果您想使用完整路径释放文件,您必须使用 x (完整路径释放) 命令。

7z e freeoarch.7z :从压缩档案 freeoarch.7z 中释放所有文件到当前文件夹。

7z e freeoarch.7z -oc:\soft *.cpp :从压缩档案 freeoarch.7z 中释放 *.cpp 文件到 c:\soft 文件夹。

l 列出压缩档案内容
7z l freeoarch.7z :列出压缩档案 freeoarch.7z 的内容。

t 测试压缩档案文件的完整性
7z t freeoarch.7z *.doc :在压缩档案 freeoarch.7z 中测试 *.doc 文件的完整性。

u 在压缩档案文件中使用较新的文件替换掉较旧的文件
7z u freeoarch.7z *.doc :在压缩档案 freeoarch.7z 中更新 *.doc 文件。

x 在当前目录中,使用完整路径从压缩档案中释放文件.或者到指定的输出文件夹
7z x freeoarch.7z :从压缩档案 freeoarch.7z 中释放所有文件到当前文件夹。

7z x freeoarch.7z -oc:\soft *.cpp :从压缩档案 freeoarch.7z 中释放 *.cpp 文件到 c:\soft 文件夹。

参数开关选项

-- 在命令行中使“--”后的选项开关“-”都失效,这样就允许在命令行中使用文件名以“-”开头的文件。
7z t -- -ArchiveName.7z :测试 -ArchiveName.7z 压缩档案。

-i指定压缩时附加文件或一类文件,该选项可附件添加多个类型。
i[<recurse_type>]<file_ref> 其中<recurse_type>为可以为r[- | 0](具体的-r选项见后面-r),<file_ref>可以为@{listfile} | !{wildcard}。
7z a -tzip src.zip *.txt -ir!DIR1\*.cpp :从当前目录中添加 *.txt 文件,和 DIR1 目录及其子目录中的 *.cpp 文件到 src.zip 压缩档案。

-x 指定某一文件或某一类文件从操作中排除。该选项可同时排除多个类型。
x[<recurse_type>]<file_ref> 其中<recurse_type>为可以为r[- | 0](具体的-r选项见后面-r),<file_ref>可以为@{listfile} | !{wildcard}。
7z a -tzip freeoarch.7z *.txt -x!temp.* :添加除 temp.* 文件之外的所有 *.txt 文件到压缩档案 freeoarch.7z。

-o 指定释放文件的输出文件夹,该选项只能和释放命令配合使用。
7z x freeoarch.7z -oc:\Doc :从 freeoarch.7z 压缩档案释放所有文件到 c:\Doc 文件夹。

-r 递归子目录选项
-r 开启递归子目录。对于 e (释放)、l (列表)、t (测试)、x (完整路径释放) 这些在压缩档案中操作的命令, 会默认使用该选项。
-r- 关闭递归子目录。对于 a (添加)、d (删除)、u (更新) 等所有需扫描磁盘文件的命令,会默认使用该选项。
-r0 开启递归子目录。但只应用于通配符。
7z l freeoarch.7z -r- *.doc :列出在 freeoarch.7z 压缩档案中根目录下的 *.doc 文件。
7z a -tzip freeoarch.7z -r src\*.cpp src\*.h :将 src 目录及其子目录中的 *.cpp 及 *.h 文件添加到 freeoarch.7z 压缩档案。

-t 指定压缩档案格式,它们可以是:zip、7z、rar、cab、gzip、bzip2、tar 或其它格式,而 默认值是 7z 格式。
7z a -tzip freeoarch.7z *.txt :使用 zip 格式从当前目录中添加所有 *.txt 文件到压缩档案 freeoarch.7z。

-y 使 7-Zip 执行命令时的大多数提示失效。您可以使用该选项来阻止在 e (释放) 和 x (完整路径释放) 命令中文件覆盖时的提示。
7z x src.zip -y :从 src.zip 释放所有文件。所有的覆盖提示将被阻止且所有相同文件名的文件将被覆盖。

-v 指定分卷大小
{Size}[b | k | m | g]
指定分卷大小,可以使用字节、KB(1 KB=1024 字节),MB(1 MB = 1024 KB)或 GB(1 GB = 1024 MB)。如果您只指定了 {Size},7-zip 将把它视为字。
7z a a.7z *.txt -v10k -v15k -v2m : 创建 a.7z 分卷压缩档案。第一个分卷为 10 KB,第二个为 15 KB,剩下全部为 2 MB。

-p 指定密码
7z x freeoarch.7z -psecret :将设有密码“secret”的压缩档案 freeoarch.7z 中所有文件释放。

-ao 指定在释放期间如何覆盖硬盘上现有的同名文件
语法:-ao[a | s | u ]
-aoa 直接覆盖现有文件,而没有任何提示。
-aos 跳过现有文件,其不会被覆盖。
-aou 如果相同文件名的文件以存在,将自动重命名被释放的文件。举个例子,文件 file.txt 将被自动重命名为 file_1.txt。
-aot 如果相同文件名的文件以存在,将自动重命名现有的文件。举个例子,文件 file.txt 将被自动重命名为 file_1.txt。
7z x test.zip -aoa :从压缩档案 test.zip 中释放所有文件并却不做提示直接覆盖现有文件。

-an 不解析命令行中的 archive_name 区域,该选项必须和 -i (附加文件) 开关一起使用。比如您为压缩档案使用列表文件,您就需要指定 -ai 选项,所以您需要禁止解析命令行中的 archive_name 区域,具体实例见后面的-ai和-ax中。

-ai 指定附加文件,包括压缩档案文件名及通配符,该选项可同时附加多个类型。
ai[<recurse_type>]<file_ref> 其中<recurse_type>为可以为r[- | 0](具体的-r选项见后面-r),<file_ref>可以为@{listfile} | !{wildcard}。
7z t -an -air!*.7z : 在当前目录及子目录下测试 *.7z 压缩档案。

-ax 指定必须从操作中排除的压缩档案,该选项可同时排除多个类型。
ax[<recurse_type>]<file_ref> 其中<recurse_type>为可以为r[- | 0](具体的-r选项见后面-r),<file_ref>可以为@{listfile} | !{wildcard}。
7z t -an -ai!*.7z -ax!a*.7z :测试除 a*.7z 之外的 *.7z 压缩档案。

更多的不常用的选项,可以查看帮助。例如:
-m设置压缩算法
-scs设置要压缩的文件的列表文件的字符集
-seml通过电子邮件发送压缩档
-sfx创建自释放档
-si从标准输入读入数据
-so从输出到标准输出
-slp设置大内存模式
-slt显示技术信息
-ssc设置区分大小写
-ssw压缩正在写入的文件


使用7za命令行为包中的文件改名

rn (Rename) command

Renames files in archive.

语法

rn <archive_name> <src_file_1> <dest_file_1> [ <src_file_2> <dest_file_2> ... ]

示例

7z rn a.7z old.txt new.txt 2.txt folder\2new.txt

Renames old.txt to new.txt and 2.txt to folder\2new.txt

The syntax to rename files inside archives is:
7za rn <archive_name> <src_file_1> <dest_file_1> [ <src_file_2> <dest_file_2> ... ]

It also allows to move files around, e.g. into a subdirectory:
7za rn archive.7z old.txt new/location/new.txt

注意
Switches that can be used with this command

-i (Include)
-m (Method)
-p (Set Password)
-r (Recurse)
-stl (Set archive timestamp from the most recently modified file)
-u (Update)
-w (Working Dir)
-x (Exclude)


如果想得知关于7zip命令行的更多用法,请参考:7zip命令行使用详细手册


对压缩包分片及分片还原

1)、压缩包分片,指定大小
Use the -v option (v is for volume) -v100m will split the archive into chunks of 100MB.
7z -v option supports b k m g (bytes, kilobytes, megabytes, gigabytes)

7za -v128m a freeoa.7z my_folder/

7za a -m0=zstd -mx=9 -v256m /tmp/zjt/freeoa.7z centos7x64/

2)、压缩包分片还原
只需要指定这些包中的第一个包即可,7z会自动寻找其它分片包:
7z ax data.7z.001
7za like that will find the others automatically (002 003 and so on)

7za x tmp/c7x64.tar.7z.001

7za x c7x64.tar.7z.001  -o/path_of_dir/output_dir

查看一个包的信息:

Scanning the drive for archives:
1 folder, 143 files, 38259749149 bytes (36 GiB)
    
Extracting archive: ww190213/190213.7z.001
--
Path = ww190213/190213.7z.001
Type = Split
Physical Size = 268435456
Volumes = 143
Total Physical Size = 38259749149
----
Path = 190213.7z
Size = 38259749149
--
Path = 190213.7z
Type = 7z
Physical Size = 38259749149
Headers Size = 928
Method = ZSTD
Solid = -
Blocks = 32


在打包压缩完成后删除源文件

使用'-sdel'选项

7z a /tmp/freeoa7.7z -m0=zstd -mx=9 -mmt2 -sdel freeoa_baks7

能不能删除还要看是否对文件或目录有相应的权限。如果不使用'sdel'选项可使用一个循环来实现完成:
for i in *.txt; do 7za a $i.7z $i; if [ $? -eq 0 ]; then rm -fv $i; fi; done


使用7-zip来取得文件的Hash校验和

命令行下的用法:
7za h [-scrc{Method}] [files]

Supported methods: CRC32, CRC64, SHA1, SHA256, BLAKE2sp. Default method is CRC32.
支持的Method有:CRC系列、SHA系列等,对MD系列没有提供支持,不过在图形界面中有对MD系列的算法有支持(鉴于对其算法安全性考虑,多数情况下已经不推荐使用md系统的算法了),默认为CRC32(是按16进制的数字输出的)。

示例:

7z h freeoa.txt
7za h -scrccrc32 freeoa.txt
计算并输出freeoa.txt文件的CRC32检验码

7za h -scrcsha256 freeoa.txt
计算并输出freeoa.txt文件的SHA256检验码

7za h *
计算并输出当前及其子目录下的所有文件的CRC32检验码,其后还会汇总计算一次

如何取得已经生成好的7z压缩包或包中相关文件的校验和?

7za l -slt xmpp.7z
列出7z包中所有目录文件的一些技术信息(其中就有CRC)

7za t gtkperl.7z gtkperl/gtkex2.pl -scrcsha256
取得gtkperl.7z包中的gtkperl/gtkex2.pl文件的sha256检验和

注意:
7za t gtkperl.7z -scrcsha256
7za t gtkperl.7z * -scrcsha256

并不能取得gtkperl.7z包的sha256检验和,7z会返回其中的数据、数据与相关名字的两个sha256检验和!要返回整个包的检验和还的用:
7za h -scrcsha256 gtkperl.7z

7za h -scrcsha256 freeoa.net.7z >>somelse_path/yourfiles.hash.log