我想将超过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替换为最后一个文件。
如果我的脚本缺少某些内容,请提供建议。
答案 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
我现在不知道如何对其他方法进行基准测试,但它应该按预期工作。