![有没有办法查看每个文件的 tar 进度?](https://linux22.com/image/1245643/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E6%9F%A5%E7%9C%8B%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%20tar%20%E8%BF%9B%E5%BA%A6%EF%BC%9F.png)
我有几个大文件需要压缩。例如,我可以使用
tar cvfj big-files.tar.bz2 folder-with-big-files
问题是我看不到任何进度,所以我不知道需要多长时间或诸如此类的事情。使用时v
我至少可以看到每个文件何时完成,但当文件很少且很大时,这不是最有帮助的。
有没有办法让 tar 显示更详细的进度?比如完成百分比、进度条或估计剩余时间等。可以针对每个文件或所有文件,也可以同时针对两者。
答案1
我更喜欢这样的一句话:
tar cf - /folder-with-big-files -P | pv -s $(du -sb /folder-with-big-files | awk '{print $1}') | gzip > big-files.tar.gz
它将有如下输出:
4.69GB 0:04:50 [16.3MB/s] [==========================> ] 78% ETA 0:01:21
对于OSX(摘自 Kenji 的回答)
tar cf - /folder-with-big-files -P | pv -s $(($(du -sk /folder-with-big-files | awk '{print $1}') * 1024)) | gzip > big-files.tar.gz
解释:
tar
tarball 工具cf
创建文件-
使用 stdout 而不是文件(以便能够将输出传送到下一个命令)/folder-with-big-files
要压缩的输入文件夹-P
使用绝对路径(不是必需的,见注释)
管道至
pv
进度监控工具-s
使用以下大小作为要传输的总数据大小(用于百分比计算)$(...)
计算表达式du -sb /folder-with-big-files
磁盘使用情况以字节为单位汇总在一行中。返回例如8367213097 folder-with-big-files
- 管道(|)
awk '{print $1}'
仅返回输出的第一部分du
(字节,删除文件夹名称)
管道至
gzip
gzip 压缩工具big-files.tar.gz
输出文件名
答案2
使用pv
。要正确报告进度,pv
需要知道您向其投入了多少字节。因此,第一步是计算大小(以千字节为单位)。您也可以完全删除进度条,只让它pv
告诉您已看到多少字节;它会报告“完成了这么多,这么快”。
% SIZE=`du -sk folder-with-big-files | cut -f 1`
进而:
% tar cvf - folder-with-big-files | pv -p -s ${SIZE}k | \
bzip2 -c > big-files.tar.bz2
答案3
更好的进度条..
apt-get install pv dialog
(pv -n file.tgz | tar xzf - -C target_directory ) \
2>&1 | dialog --gauge "Extracting file..." 6 50
答案4
灵感来自帮手的回答
另一种方法是使用本机tar
选项
FROMSIZE=`du -sk --apparent-size ${FROMPATH} | cut -f 1`;
CHECKPOINT=`echo ${FROMSIZE}/50 | bc`;
echo "Estimated: [==================================================]";
echo -n "Progess: [";
tar -c --record-size=1K --checkpoint="${CHECKPOINT}" --checkpoint-action="ttyout=>" -f - "${FROMPATH}" | bzip2 > "${TOFILE}";
echo "]"
结果就像
Estimated: [==================================================]
Progess: [>>>>>>>>>>>>>>>>>>>>>>>
一个完整的例子这里