使用 pv 一次可以对多个文件/文件夹执行每个文件的 tar 进度吗?

使用 pv 一次可以对多个文件/文件夹执行每个文件的 tar 进度吗?

我一直在使用在另一篇文章中找到的这个一行命令,它每次对一个文件夹都很有效。这是命令:

tar -cf - /opt/folder1 | pv -s $(du -sb /opt/folder1 | awk '{print $1}') | gzip > archive.tar.gz

如何将其更改为一次处理多个文件/文件夹并获得总体进度,而不是为每个文件夹/文件运行相同的命令。以下是用例:

我有 /opt/folder1、/opt/folder2 和 /opt/folder3/*.db 文件。这些都可以像这样组合成一个变量。

filestobackup=(
        /opt/folder1
        /opt/folder2 
        /opt/folder3/*.db
    )

这不起作用:

tar -cf - "${filestobackup[@]}" | pv -s $(du -sb "${filestobackup[@]}" | awk '{print $1}') | gzip > archive.tar.gz

答案1

快速回答:将该行改为

tar -cf - "${filestobackup[@]}" | pv -s $(du -cb "${filestobackup[@]}" | tail -1 | awk '{print $1}') | gzip > archive.tar.gz

长答案:问题是du会产生多行输出,而不是像单个目录情况那样只产生一行。开关-s使du打印总大小每个条目。由于您要传递多个条目(两个用于文件夹 1 和文件夹 2,外加文件夹 3 中的du每个文件一个),因此将打印类似以下内容的内容:.dbdu

2112345 opt/folder1
57148   opt/folder2
388     opt/folder3/foo.db
161     opt/folder3/bar.db

通过使用 switch -cdu打印最后一行,其中包含总计。为了使用此值,您必须过滤du输出以仅获取最后一行。

这可以通过已经在管道中使用的 awk 来完成,或者更简单地通过添加过滤器来完成,尽管性能会有所(轻微)损失tail -1

相关内容