当我使用 zip 时,如何在不淹没命令行的情况下显示整体进度?

bug*_*bug 39 bash terminal zip progress-information

一个固定长度的进度条、一个文件或字节数,或者更好的是一个显示估计剩余时间的计时器是理想的。

zip的标准行为似乎是为每个处理的文件打印一行,但是当我压缩数千个文件时,我不希望信息过载。我想估计需要多长时间。

我尝试将-q( --quiet) 选项与-dg( --display-globaldots)结合使用,但这只是用多行点填充标准输出,并没有给出任何有用的指示。

我也-qdgds 10m按照手册页中的说明进行了尝试,但得到了相同的结果。

然后我尝试了-db( --display-bytes) 和-dc( --display-counts) 但似乎没有全局选项,所以它再次为每个文件名打印它。

最后,我与-qlike一起尝试了它-qdbdc,但它什么也没输出。

有趣的是,我在 info-zip 站点上找到了一个手册页,其中提到了一个-de( --display-est-to-go) 选项,该选项应该“显示完成存档操作的估计时间”。

这听起来和我想要的完全一样,但问题是我的版本zip没有那个功能。我使用的是 Ubuntu 14.04.1 64 位、bash-4.3.30(1) 和 zip-3.00。根据维基百科,这是 zip 的最新稳定版本。

info-zip sourceforge 页面上有未发布的测试版,但我不想将我的数据委托给测试版。

ped*_*ero 20

zip可以将数据压缩到标准输出。因此,您可以将其与其他工具结合使用,例如pv

zip -qr - [folder] | pv -bep -s $(du -bs [folder] | awk '{print $1}') > [file.zip]
Run Code Online (Sandbox Code Playgroud)

-bep为方便起见,删除其中一个选项。


qwr*_*qwr 14

如果您可以使用 7z:

7z a output.zip folder/
Run Code Online (Sandbox Code Playgroud)

这会给你一个这样的进度条:

Open archive: test.zip
--
Path = test.zip
Type = zip
Physical Size = 232039663

Scanning the drive:
3 folders, 2401 files, 238122225 bytes (228 MiB)

Updating archive: test.zip

Items to compress: 2404

 16% 279 U folder/file.txt  
Run Code Online (Sandbox Code Playgroud)

  • 当我最终使 zip 的 -rqdgds 选项起作用时,它在下一行显示每个点,如果您需要超过几十个点,则这是无用的。所以 7z 确实是最简单的方法。 (2认同)

小智 5

我已经成功地使用了以下内容:

zip -r [target_zip] [folder_to_zip] 2>&1 | 
pv -lep -s $(ls -Rl1 [folder_to_zip] | egrep -c '^[-/]') > /dev/null
Run Code Online (Sandbox Code Playgroud)

这解释如下:

zip -r [target_zip] [folder_to_zip] 2>&1 |
Run Code Online (Sandbox Code Playgroud)

将 [folder_to_zip] 递归压缩到 [target_zip] 文件中,将 stderr 重定向到 stdout。请注意,stderr 将为正在处理的每个文件和目录包含一行

pv -lep -s $(ls -Ral1 [folder_to_zip] | egrep -c '^[-/]') > /dev/null
Run Code Online (Sandbox Code Playgroud)

pv当它们从 zip 输出时,将它们导入到带有文件名的行中。pv在行模式下运行(基于行和大小的计数进度也是预期的行数 - 请参阅PV 手册页 -l 选项)。

通过递归列出 (ls) [folder_to_zip] 并计算以 '-' 或 'd' 开头的行,即所有文件和目录(记住目录以 '/' 开头)

以上提供了准确的完成百分比,因为在处理完所有文件和目录后达到 100%。

pedroapero 答案的问题在于,进度是根据已处理(压缩)的字节数与要处理(未压缩)的总字节数来计算的。因此,该过程将在 30% 左右完成(取决于压缩率)。