Bash,查找并删除旧文件

Bash,查找并删除旧文件

编写脚本备份文件并删除旧备份:

#!/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

一些东西:

  1. ROTATE=1似乎没有多大意义,您可能需要多个备份,以防万一。您经常会在几天内注意到出现问题...如果您只有昨晚的备份,祝您好运!

  2. chmod 600 $CURRENT应尽快完成;如果您确实担心文件的安全性,请在创建 tarball 之前执行此操作(如我的示例中所示。)

  3. 通过在数字前面find添加一个来修复。这是我每次都会得到的东西,所以不要感到难过。实际上,如果你使用它的话意味着+$ROTATE+年长或同等,如果您使用“-”,测试将被反转(因此-mtime +7或多或少相当于! -mtime -7- 可能在 1 天内,这之间不太可能匹配一侧或另一侧。)使用您使用的普通数字 ( -mtime 1) ,它将删除在特定日期修改的文件。如果该脚本 3 天没有运行,那么这 3 个文件将永远不会被删除。

  4. 使用起来更容易-delete ,因此您不必考虑示例代码中错过的引用(即-exec rm "{}" \;,以防文件名包含特殊字符)

  5. 我建议您添加一个,-name因为您有一个简单的方法可以知道有问题的文件是否是备份。这只是为了安全。如果您从未将任何其他文件放入该目录中(例如您想要保留较长时间的备份副本),那么您就不需要它。

  6. -e在 hash bang ( ) 中添加选项#!/bin/sh -e是个好主意,这样脚本就会在出现第一个错误时停止。有时脚本运行时会生成错误,但您却看不到它们。

相关内容