有没有办法查看每个文件的任何 tar 进度?

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-files
    • 管道 (|)awk '{print $1}'只返回du输出的第一部分(字节,删除文件夹名称)

管道到

  • gzip gzip压缩工具
  • big-files.tar.gz 输出文件名

  • 不错,一个班轮。你能解释一下吗?或者它只是以某种方式神奇地工作? (9认同)
  • 我参加聚会有点晚了,但我想知道为什么这个答案建议在 tar 上使用 -P 选项。这似乎是个糟糕的建议,因为 OP 没有提到需要在 tarball 中使用绝对路径(并且在提取存档时使用它们会导致真正的麻烦)。 (8认同)
  • 请注意,直到 du 命令完成后才会显示进度,这可能需要一段时间,具体取决于目录的大小、复杂性和碎片。 (4认同)
  • 在 OSX 上,du 不接受 -b 参数,需要回退到: $((du -sk /folder-with | awk '{print $1}') * 1024)) (3认同)
  • 对于那些只想在 macOS 上“tar”而不进行压缩的人:“tar -cfolder-with-big-files | pv -s $[$(du -sk 带有大文件的文件夹 | awk '{print $1}') * 1024] > 带有大文件的文件夹.tar`。 (3认同)
  • 你能写出像上面那样提取 tar 文件的命令吗? (2认同)
  • 好的,我有它`pv $FILE.tgz | tar xzf - -C $DEST_DIR` (2认同)
  • 我可以建议使用 `cut` 而不是 `awk` 吗?就像 `cut -f1` 而不是 `awk '{print $1}'` 吗? (2认同)

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)

  • 第一行:获取有关将处理多少字节的信息。第二行:使用第一行的大小以允许 pv 呈现“进度”。由于您正在传输数据,因此 pv 不知道还会有多少字节。 (4认同)
  • @lzkata 你总是可以要求 `du` 使用你喜欢的块大小,例如 `du -s --block-size=1000`,或者只使用普通字节,例如从 `du` 中删除 `k` 和`pv` 调用。尽管如此,除非另有说明,否则我希望两者都使用`1024`,例如`--si` 开关在`du` 上,例如。 (2认同)
  • 或者只是删除 k-stuff 并只使用普通字节(`du -sb` 和 `pv -s` 不带任何修饰符)。这应该会结束所有的混乱。 (2认同)

小智 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)

在此处输入图片说明

  • 这适用于提取,但您仍然需要执行更复杂的创建命令之一(这是原始问题)。它仍然可以与那些结合;它只是更复杂。 (2认同)

小智 22

查看tar 信息页面中的--checkpoint--checkpoint-action选项(至于我的发行版,这些选项的描述未包含在手册页中?RTFI)。

https://www.gnu.org/software/tar/manual/html_section/checkpoints.html

有了这些(也许还有编写您自己的检查点命令的功能),您可以计算出一个百分比……

  • 这应该是正确答案。其他人只是解释了额外的工具(默认情况下未安装,此外)来实现类似的功能。 (3认同)

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)

来源:


J_Z*_*Zar 6

基于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)