将GZIP多个文件转换为1个文件gz

时间:2012-07-30 03:24:04

标签: bash shell unix

我想将超过30天的所有文件备份到1个存档文件中。

我尝试使用这个脚本:

#!/bin/bash

# Find all files that older than 30 days and store it into backup.tar.gz
find ~/Algorithm/test/PDF -mtime +30 -exec tar czvf backup.tar.gz {} \;

但不幸的是,它只备份了最后一个文件而不是所有文件,我发现上面的脚本只是将backup.tar.gz替换为最后一个文件。

如果我的脚本缺少某些内容,请提供建议。

3 个答案:

答案 0 :(得分:5)

当您使用\;终止查找-exec时,它会为每个文件运行一次命令。所以你多次运行tar,每次都创建一个包含单个文件的tar文件,每个文件都覆盖了前一个文件。

\;更改为+,find会将多个文件分组到exec命令的单个运行中,因此它会更好一些,但潜伏着会有问题。当有太多文件无法放入命令行时,find会将其拆分,您将重复上一个问题。

要真正做到这一点,您希望find生成tar可以读取的文件列表,而不是尝试将它们全部放在命令行上。要正确处理所有文件名,您需要以'\ 0'分隔格式列表。 GNU tar& find可以做到这一点:

find ~/Algorithm/test/PDF -mtime +30 -print0 |
  tar --null --files-from=- -czvf backup.tar.gz

答案 1 :(得分:0)

find为找到的每个文件执行函数。您需要将列表传递给函数才能使其正常工作。将find作为子函数执行并将其传递给tar gzip链应该有效。

 tar czvf - $(find ~/Algorithm/test/PDF -mtime +30) | gzip -c backup.tar.gz

答案 2 :(得分:0)

假设您已经有一个现有的,未经过压缩的backup.tar,您还可以将文件附加到tarball

 find . -exec tar rf backup.tar && gzip backup.tar

我现在不知道如何对其他方法进行基准测试,但它应该按预期工作。