Python结合7z实现文件夹批量压缩与解压

这几天我有个小伙伴找我帮忙,他们公司这周需要应用迁移。情况是这样的,应用大概有20~30个,主要是.net与nodejs项目,而且是放在两个特定目录之中的,服务器是Windows操作系统的。因为应用有点多,一个个搞嫌麻烦,所以找我看看有没有稍微简单的办法。刚好之前在电脑重装系统做数据备份的时候做过类似的工具,刚好可以跟大家一起分享一下。

1. 先下载7-zip工具

  • 下载地址:https://www.7-zip.org/download.html

我下载的是:

Python结合7z实现文件夹批量压缩与解压_第1张图片
我下载的是

2.一些压缩相关命令与参数

2.1.压缩相关

压缩命令参考
7z.exe  a -t7z E:\ApplicationBackups\压缩的文件.7z  E:\ApplicationBackups\压缩的目录\* -r -mx=5 -m0=LZMA2 -ms=10m -mf=on -mhc=on -mmt=on

参数说明:

  • a:这个表示add命令,即新建一个压缩文件,该压缩文件存放在当前目录下。还有其他的命令,例如解压缩,从压缩文件中删除一个文件,等等
  • -t7z:这个表示使用的压缩类型是7z。类似的还有 -tzip 等等。
  • E:\ApplicationBackups\压缩的文件.7z:新建的压缩文件的路径。
  • E:\ApplicationBackups\压缩的目录\*:这个表示把该目录下的所有的文件都执行压缩操作,添加到压缩文件中
  • -r:这个参数表示遍历所有的子目录,每个文件都执行压缩操作,添加到压缩文件中。
  • -mx=9:这个参数表示压缩等级,9级是最高等级。默认等级是5
  • -m0=LZMA2:这个参数表示优先使用 LZMA2 算法。类似的,还可以设置第二优先 -m1=LZMA ,第三优先 -m2=BZip2
  • -ms=10m:这个参数表示开启固实模式,这种模式是把压缩包中的所有文件都当成一个连续数据流来看待。通常情况下,固实压缩可增加压缩比,特别是在添加大量小文件的时候。这里除了开启固实模式,还设置了以10兆作为一个数据块
  • -mf=on:这个参数表示开启可执行文件压缩过滤器。
  • -mhc=on:这个参数表示对压缩包的文件头也进行压缩
  • -mmt=on:这个参数表示开启多线程,提高压缩速度
  • -x!:排除路径或文件
  • -xr!:排除文件夹

2.2.解压相关

7z.exe x E:\ApplicationBackups\压缩的文件.7z -oE:\Application\ -aoa

参数说明:

  • x:这个表示解压缩,并且使得压缩包内的文件所在的目录结构保持不变。如果你希望解压缩后所有的文件都存放在同一个目录下,则使用 e 这个命令。
  • E:\ApplicationBackups\压缩的文件.7z:需要解压缩文件的路径。
  • -o:这个表示把压缩包内的文件解压缩到 E:\Application\ 目录下。-o 这个参数用于指定输出目录。
  • -aoa:这个表示直接覆盖现有文件,而没有任何提示。类似的参数还有:
    • -aos 跳过现有文件,其不会被覆盖。
    • -aou 如果相同文件名的文件以存在,将自动重命名被释放的文件。举个例子,文件 file.txt 将被自动重命名为 file_1.txt。
    • -aot 如果相同文件名的文件以存在,将自动重命名现有的文件。举个例子,文件 file.txt 将被自动重命名为 file_1.txt。

3.编写单个文件夹压缩脚本

针对单个文件夹压缩脚本参考:

为了方便区分,我这设置了三种情况分别是:

  • 排除目录的情况
  • 保留目录,但排除目录下的内容的情况
  • 排除指定文件或指定文件后缀的情况

命令部分大家根据需求自行调节参数

import os,time
  
#需要备份起始文件夹
source_dir="E:\\NodeJs_Projects\\项目1\\"
#备份保存到
save_dir = 'E:\\temp\\'
# 排除的指定文件夹
ignore_folder=['.vscode','node_modules']
# 排除的任意指定文件
ignore_files=['*.log','*.md','*.tmp'] 
# 排除指定路径下的文件(会保留相应路径下的文件夹)
ignore_path_files=['app/*','log/*','runtime/session/*','runtime/config/*']

ignore_str=''
for i in ignore_files:
    ignore_str=ignore_str+'-x!'+i+' '

for i in ignore_folder:
    ignore_str=ignore_str+'-xr!*'+i+' '

for i in ignore_path_files:
    ignore_str=ignore_str+'-x!'+i+' '
    
#  ============================= 将文件压缩 ===============
 
# 获取备份的文件夹名称
dname=os.path.dirname(source_dir).split(os.sep)[-1]
# 拼接文件名
fname =dname+"@" +time.strftime('%Y-%m-%d-%H-%M')+'.7z'
# 拼接保存文件路径
target = save_dir + os.sep +fname
# 拼接命令(按需要自行修改)
cmd=os.getcwd()+"\\7z1900-x64\\7z.exe  a -t7z %s  %s%s* -r %s -mx=5 -m0=LZMA2 -ms=10m -mf=on -mhc=on -mmt=on"%(target,source_dir,os.sep,ignore_str)
print(cmd)
# 执行压缩
os.system(cmd ) 
print(source_dir,'=====>',target)

运行效果

Python结合7z实现文件夹批量压缩与解压_第2张图片

4.编写批量压缩脚本

批量压缩,只是在单个文件夹压缩的基础上多了一步就是扫描目录或自定义批量文件路径的操作

多个文件夹压缩脚本参考:

import os,time
  
#需要备份起始文件夹
source_dir="E:\\NodeJs_Projects\\"
#备份保存到
save_dir = 'E:\\temp\\'
# 排除的指定文件夹
ignore_folder=['.vscode','node_modules','.git','.svn']
# 排除的任意指定文件
ignore_files=['*.log','*.md','*.tmp'] 
# 排除指定路径下的文件(会保留相应路径下的文件夹)
ignore_path_files=['app/*','log/*','runtime/session/*','runtime/config/*','development.js',"Log"]

ignore_str=''
for i in ignore_files:
    ignore_str=ignore_str+'-x!'+i+' '

for i in ignore_folder:
    ignore_str=ignore_str+'-xr!*'+i+' '

for i in ignore_path_files:
    ignore_str=ignore_str+'-x!'+i+' '
    
#  ============================= 将文件压缩 ===============
# 获取需要压缩的项目文件夹
dirs = os.listdir( source_dir )
#dirs=["demo1","demo1"] # 或者自定义项目名

# 指定不压缩的文件夹
skip_dirs= ['更新说明','历史备份','杂项']

for d in dirs:
    if d in skip_dirs:
        continue
    d_path=source_dir+d+os.sep
    if os.path.isdir(d_path): 
        # 拼接文件名
        fname =d+"@" +time.strftime('%Y-%m-%d-%H-%M')+'.7z'
        # 拼接保存文件路径
        target = save_dir + os.sep +fname
        # 拼接命令(按需要自行修改)
        cmd=os.getcwd()+"\\7z1900-x64\\7z.exe  a -t7z %s  %s%s* -r %s -mx=5 -m0=LZMA2 -ms=10m -mf=on -mhc=on -mmt=on"%(target,d_path,os.sep,ignore_str)
        print(cmd)
        # 执行压缩
        os.system(cmd ) 
        print(source_dir,'=====>',target)

运行效果

Python结合7z实现文件夹批量压缩与解压_第3张图片

5.批量解压

批量解压就很简单了,只要指定解压路径后,循环执行解压命令就行了。

import  os

# 压缩包来源目录
source=os.getcwd()
# 解压到
target_dir='E:\\testApplication\\'

files = os.listdir( source )
for f in files:
    f_path=source+os.sep+f
    if os.path.isfile(f_path):
        exn=f.split(".")[-1]
        if exn=="7z":
            d_name=f.split("@")[0]
            target = target_dir + os.sep +d_name
            print(f_path,"===>",target)
            # 解压命令(按需要自行修改)
            cmd=os.getcwd()+"\\7z1900-x64\\7z.exe x %s -o%s -aoa"%(f_path,target)
            os.system(cmd )  

运行效果

Python结合7z实现文件夹批量压缩与解压_第4张图片

你可能感兴趣的:(Python结合7z实现文件夹批量压缩与解压)