Svi*_*ish 162 unix tar progress
我有几个要压缩的大文件。例如,我可以这样做
tar cvfj big-files.tar.bz2 folder-with-big-files
Run Code Online (Sandbox Code Playgroud)
问题是我看不到任何进展,所以我不知道需要多长时间或类似的事情。使用v我至少可以看到每个文件何时完成,但是当文件很少而且很大时,这不是最有帮助的。
有没有办法让 tar 显示更详细的进度?比如完成的百分比或进度条或估计的剩余时间等等。对于每个文件或所有文件或两者。
che*_*sum 153
我更喜欢这样的单线:
tar cf - /folder-with-big-files -P | pv -s $(du -sb /folder-with-big-files | awk '{print $1}') | gzip > big-files.tar.gz
Run Code Online (Sandbox Code Playgroud)
它将有这样的输出:
4.69GB 0:04:50 [16.3MB/s] [==========================> ] 78% ETA 0:01:21
Run Code Online (Sandbox Code Playgroud)
对于 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
Run Code Online (Sandbox Code Playgroud)
说明:
tar 压缩包工具cf 创建文件- 使用 stdout 而不是文件(以便能够将输出通过管道传输到下一个命令)/folder-with-big-files 要压缩的输入文件夹-P 使用绝对路径(不必要,见评论)管道到
pv 进度监控工具-s 使用以下大小作为要传输的总数据大小(用于百分比计算)
$(...) 评估表达式du -sb /folder-with-big-files磁盘使用情况以字节为单位汇总在一行中。返回例如8367213097 folder-with-big-filesawk '{print $1}'只返回du输出的第一部分(字节,删除文件夹名称)管道到
gzip gzip压缩工具big-files.tar.gz 输出文件名aki*_*ira 78
您可以使用pv来实现这一点。要正确报告进度,pv需要知道您投入了多少字节。因此,第一步是计算大小(以千字节为单位)。您也可以完全删除进度条,然后pv告诉您它看到了多少字节;它会报告“做那么多,那么快”。
% SIZE=`du -sk folder-with-big-files | cut -f 1`
Run Code Online (Sandbox Code Playgroud)
进而:
% tar cvf - folder-with-big-files | pv -p -s ${SIZE}k | \
bzip2 -c > big-files.tar.bz2
Run Code Online (Sandbox Code Playgroud)
小智 28
更好的进度条..
apt-get install pv dialog
(pv -n file.tgz | tar xzf - -C target_directory ) \
2>&1 | dialog --gauge "Extracting file..." 6 50
Run Code Online (Sandbox Code Playgroud)

小智 22
查看tar 信息页面中的--checkpoint和--checkpoint-action选项(至于我的发行版,这些选项的描述未包含在手册页中?RTFI)。
见https://www.gnu.org/software/tar/manual/html_section/checkpoints.html
有了这些(也许还有编写您自己的检查点命令的功能),您可以计算出一个百分比……
cam*_*ano 19
灵感来自助手的回答
另一种方法是使用本机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 "]"
Run Code Online (Sandbox Code Playgroud)
结果就像
Estimated: [==================================================]
Progess: [>>>>>>>>>>>>>>>>>>>>>>>
Run Code Online (Sandbox Code Playgroud)
一个完整的例子在这里
Mur*_*mel 16
仅使用 tar
tar可以选择(自 v1.12 起)使用 打印信号的状态信息--totals=$SIGNO,例如:
tar --totals=USR1 -czf output.tar input.file
Total bytes written: 6005319680 (5.6GiB, 23MiB/s)
Run Code Online (Sandbox Code Playgroud)
该Total bytes written: [...]信息会打印在每个 USR1 信号上,例如:
pkill -SIGUSR1 tar
Run Code Online (Sandbox Code Playgroud)
来源:
基于tqdm 的方法:
tar -v -xf tarfile.tar -C TARGET_DIR | tqdm --total $(tar -tvf tarfile.tar | wc -l) > /dev/null
Run Code Online (Sandbox Code Playgroud)