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

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

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

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 页面上有未发布的测试版,但我不想将我的数据委托给测试版。

答案1

如果您可以使用 7z:

7z a output.zip folder/

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

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  

答案2

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

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

-bep根据您的方便删除其中一个选项。

答案3

我已成功使用以下内容:

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

解释如下:

zip -r [target_zip] [folder_to_zip] 2>&1 |

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

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

pv当文件名从 zip 输出时,通过管道插入到包含文件名的行中。pv在行模式下操作(根据行数和大小计算进度也是预期的行数 – 请参阅PV 手册页 -l 选项)。

预期行的总大小是通过递归列出 (ls) [folder_to_zip] 并计算以“-”或“d”开头的行来收集的,即,所有文件和目录(记住目录以 '/' 开头)

上面提供了准确的完成百分比,因为当所有文件和目录都已处理完毕时就达到了 100%。

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

答案4

您可以-qq向命令添加标志。这对我有用。
例子:

zip -r -qq out_chairs.zip out_chairs/

相关内容