我一直在使用在另一篇文章中找到的这个一行命令,它每次对一个文件夹都很有效。这是命令:
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
每个文件一个),因此将打印类似以下内容的内容:.db
du
2112345 opt/folder1
57148 opt/folder2
388 opt/folder3/foo.db
161 opt/folder3/bar.db
通过使用 switch -c
,du
打印最后一行,其中包含总计。为了使用此值,您必须过滤du
输出以仅获取最后一行。
这可以通过已经在管道中使用的 awk 来完成,或者更简单地通过添加过滤器来完成,尽管性能会有所(轻微)损失tail -1
。