解压大文件时,如何显示进度、条形图或百分比?
unzip zipfile.zip
没有显示任何进度信息?
答案1
无需安装任何其他东西,最简单的方法是让它为使用 awk 提取或处理的每个文件打印一个点。
unzip -o source.zip -d /destDirectory | awk 'BEGIN {ORS=" "} {print "."}'
如果它是一个较大的 zip 文件,那么您可以选择每 10 个或 20 个文件打印一个点,如下所示:
unzip -o source.zip -d /destDirectory | awk 'BEGIN {ORS=" "} {if(NR%10==0)print "."}'
只需将 NR%10 部分中的“10”更改为您想要的增量即可。
另外,您可以安装 pv 命令,它与 unzip 配合得不太好,但提供的一行视图还不算太糟糕。
安装pv:
sudo apt install pv
使用 pv 解压:
unzip -o source.zip -d /destDirectory | pv -l >/dev/null
显示的输出如下:
28.2k 0:00:03 [9.36k/s] [ <=> ]
但是,由于 zip 文件的处理方式,它不会像我们希望的那样以有意义的方式显示进度条。
答案2
显示压缩/解压进度的另一种方法是使用 7zip 程序。在最新版本 16.02(发布于 2016-05-21)中,它以百分比显示进度。
自 artuful/16.10 版本以来,Ubutuntu 存储库中提供了 16.02 版的软件包p7zip
。较旧的 Ubuntu 版本在存储库中只有 p7zip 版本 9.20.1,没有进度指示器。我从 bionic 存储库手动安装了 Ubuntu xenial/16.04 中的 pzip 16.02 版本,似乎没有其他依赖项(p7zip、p7zip-full 和 p7zip-rar)。
7z x source.zip -o/destDirectory
请注意,“-o”和目标目录名称之间不能有空格。
答案3
你可能想要使用tqdm
,这是一个 Python 库,但也有一个 CLI,并且将显示提取过程中的真实进度,而不仅仅是在一切完成后:
unzip zipfile.zip | tqdm > /dev/null
以百分比形式显示进度比较困难,因为不知道要打印的行数。可以unzip
从输出中获取文件数:unzip -l zipfile.zip
n_files=`unzip -l zipfile.zip | tail -n 1 | xargs echo -n | cut -d' ' -f2`
然后您可能希望:
unzip -o zipfile.zip | tqdm --desc extracted --unit files --unit_scale --total $n_files > /dev/null
最终输出:
extracted: 100%|███████████████████████████████| 15126/15126 [00:00<00:00, 16218.28files/s]
但是 unzip 打印的输出可能不仅是解压后的文件名称,还可能包含其他一些操作(如压缩或链接内容),具体取决于 zip 文件的内容。因此,它n_files
确实包含正确数量的文件,但步骤数量可能更多。一旦tqdm
超过 100%,它将切换到默认进度输出,如上面的第一个示例所示。
Ubuntu 软件包名称目前为python3-tqdm
。当然,man tqdm
非常有帮助。
答案4
或者,您可以查看文件解压到的目标目录的大小。例如,您可以使用:
watch -n 60 du -sh dest_directory
写信给哪里dest_directory
是哪里。unzip
-s
用于显示尺寸,-h
使其易于阅读。此外,此过程每秒重复一次60
。您可以根据自己的设置进行更改。
因为它du
循环调用(目录使用),所以它可能比其他答案效率低。但是,如果您使用unzip
类似 的选项进行调用-q
,这意味着unzip
将不再写入stdout
,因此您无法基于此使用其他答案,那么它可能是您唯一的选择。它也可以更快,因为当您有大量小文件时,-q
它将提高速度。unzip