编写脚本备份文件并删除旧备份:
#!/bin/sh
BACKUPDIR=/var/backups/files
ROTATE=1
mkdir -p $BACKUPDIR
CURRENT="$BACKUPDIR/`date +%Y-%m-%d`-files.tar.gz"
cd /var/ && tar czf $CURRENT www
find $BACKUPDIR -type f -mtime $ROTATE -exec rm {} \;
chmod 0600 $BACKUPDIR/*
命令行(用于测试):
find $BACKUPDIR -type f -mtime $ROTATE -exec rm {} \;
不知何故,该脚本不起作用。但是,如果我在控制台中执行它,一切正常并且旧文件会被删除。但是,如果我运行该脚本,文件不会被删除(当我运行脚本时会创建 tar 存档)。为什么?
脚本权限是755
.
答案1
正如 Fiximan 所建议的,您可能想要使用该-delete
选项,尽管这对您的情况没有什么影响,如果您要输入带有空格或其他特殊字符的文件名,您的脚本将会失败。
#!/bin/sh -e
BACKUPDIR=/var/backups/files
# I suggest a little more than 1 day (i.e. about 1 week of backups is
# probably safer.)
ROTATE=7
mkdir -p $BACKUPDIR
CURRENT="$BACKUPDIR/`date +%Y-%m-%d`-files.tar.gz"
# Create protected file, then backup data in it
touch $CURRENT
chmod 600 $CURRENT
cd /var/ && tar czf $CURRENT www
# Here we have the attempt at deleting, notice the "+"
find $BACKUPDIR -type f -name '*-files.tar.gz' -mtime +$ROTATE -delete
一些东西:
ROTATE=1
似乎没有多大意义,您可能需要多个备份,以防万一。您经常会在几天内注意到出现问题...如果您只有昨晚的备份,祝您好运!chmod 600 $CURRENT
应尽快完成;如果您确实担心文件的安全性,请在创建 tarball 之前执行此操作(如我的示例中所示。)通过在数字前面
find
添加一个来修复。这是我每次都会得到的东西,所以不要感到难过。实际上,如果你使用它的话意味着+
$ROTATE
+
年长或同等,如果您使用“-”,测试将被反转(因此-mtime +7
或多或少相当于! -mtime -7
- 可能在 1 天内,这之间不太可能匹配一侧或另一侧。)使用您使用的普通数字 (-mtime 1
) ,它将删除在特定日期修改的文件。如果该脚本 3 天没有运行,那么这 3 个文件将永远不会被删除。使用起来更容易
-delete
,因此您不必考虑示例代码中错过的引用(即。-exec rm "{}" \;
,以防文件名包含特殊字符)我建议您添加一个,
-name
因为您有一个简单的方法可以知道有问题的文件是否是备份。这只是为了安全。如果您从未将任何其他文件放入该目录中(例如您想要保留较长时间的备份副本),那么您就不需要它。-e
在 hash bang ( ) 中添加选项#!/bin/sh -e
是个好主意,这样脚本就会在出现第一个错误时停止。有时脚本运行时会生成错误,但您却看不到它们。