0

我想将所有超过 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 首先替换为最后一个文件。

如果我的脚本缺少某些内容,请告知。

4

3 回答 3

5

当您使用 a\;终止 find -exec 时,它会为每个文件运行一次该命令。因此,您多次运行 tar,每次都创建一个包含单个文件的 tar 文件,并且每个文件都覆盖了前一个文件。

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

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

find ~/Algorithm/test/PDF -mtime +30 -print0 |
  tar --null --files-from=- -czvf backup.tar.gz
于 2012-07-30T03:38:46.447 回答
0

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

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

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

于 2012-07-30T06:33:42.690 回答
0

find executes the function for each file it finds. You need to pass the list to the function for this to work. Executing the find as a sub function and passing it to the tar gzip chain should work.

 tar czvf - $(find ~/Algorithm/test/PDF -mtime +30) | gzip -c backup.tar.gz
于 2012-07-30T03:34:01.627 回答