如何批量分别压缩大量大型文件 |7z 7zip cmd powershell RAR

发布时间 2023-10-24 09:43:16作者: cybozu开发者

Background

我们经常压缩文件,这点很普通。但有时候会产生分卷压缩的需求。

所谓分卷,就是把压缩文件拆分成若干文件,已达到限制单个文件容量上限的目的。

在目前的时代下,这种需求非常小众,但以下两种情况还是有可能会有作用。

  • 想把非常大的文件/文件夹上传到网盘,但是网盘有单个文件容量限制

  • 拆分后文件的hash就会面目全非,可以防止和别人重复的文件被系统误删。
    ?不放心还可以加上密码

Requirement

全自动分别批量分卷压缩某个文件夹下的所有文件

譬如有这样一个需求:

? 我有一个专门放电影的文件夹,其中有100部电影,单个视频文件超10G,20G是家常便饭。还有不少是蓝光原盘达到40G-90G。 现在想要在某网盘上备份这些内容,或者是分卷成DVD大小以便烧录,但是实际操作时遇到以下困难:

  • 网盘单个文件上限为5G,大文件无法上传

  • 有些视频由于版权原因,很可能无法上传或是在将来被封禁

  • 想要分别对每个电影进行打包,因为全打包将来是无法取用的,但是用GUI一个一个操作工作量太大

现寻求一个高效可行的解决方法

调查过程

调查前的设想

  • 压缩工具用7zip,因为7zip有着高效的压缩算法和丰富的参数

  • 如何循环得到每个文件名,如何传文件名等参数进入7z命令是解决问题的关键

7z的命令行文档

在官方网站上并未找到命令行手册,但却发现了这个网站:

Command Line Syntax

其中资料比较齐全,各个命令,参数的使用方式也都有列举。

command line如何循环

找到这样一个手册网站,支持多种平台,这个是command prompt

For /f - Loop through text - Windows CMD - SS64.com

其他详细情况根据需要自行调查即可

结论

最后我得到在command prompt下可用的command是

for /f %f in ('dir /b') do 7z a %f.7z %f -v1024m

  

简单解释

  • for in do是cmd循环语句,三个关键词都是必须的

  • /f 是循环文件用的

  • %f 是参数,用来指代每次循环的文件名,在bat文件中须用%%f。字母不一定是f,自由取。

  • ‘dir’ 是dir命令。 /b 是裸形式,不含驱动器卷标,文件大小等信息。

  • 7z 的 a 是压缩命令

  • %f.7z 是目标文件名,%f 是需要压缩的文件名

  • -v 是分卷,1024m 是每卷 1024 兆。

  • 其他

    压缩度

    由于是视频压缩本来基本无压缩空间,为节约时间,压缩方法可以用copy only,加上参数

    -mx=0

    for /f %f in ('dir /b') do 7z a  %f.7z %f -v1024m -mx=0

     

    后缀名

    按上面的方法,压缩后的文件名会带上扩展名。例如:

    filename.txt
    —>
    filename.txt.7z.001

     

    如不想要扩展名,需要对文件名进行拆分。代码如下:

    for /f "tokens=1,2 delims=." %f in ('dir /b') do 7z a %f.7z %f.%g -v1024m

     

    大致的意思是,用. 拆分文件名,得到基本名和扩展名。%g自动成为第二个参数,也就是扩展名。

    补充:powershell下如何运行?

    有没有感觉到command prompt下的命令非常难以理解,于是抱着试试看的心态调查了powershell下这个命令会变成什么样。

    虽然调查过程有曲折,这里就略去过程,直接上结果:

    $ext = ".7z"
    foreach ($file in Get-ChildItem){   
        $target = $file.BaseName+$ext
        7z a "$target" "$file" -v1024m -mx=0
    }

     

    变得更像一个正常的程序了,改造起来也更方便了。

  • 如果有人想问,RAR下如何操作?

  •  更多内容请点?:开发者网站--如何批量分别压缩大量大型文件