我创建了一个脚本,该脚本应该删除目录及其内容早于 2 天的内容。该脚本工作正常,但目录没有被删除。请帮助,我们将不胜感激。
脚本详细信息:
export BACKUP_SETS=/backupset/
if [ ! -d "$BACKUP_SETS" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
printf "\nFailure when removing BACKUP_SETS, Exiting \n"
exit 1
else
two_days=$(date -d "2 days ago" +%Y_%b_%d)
for f in $BACKUP_SETS[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]; do
[ -d "$f" ] || continue
(( $f < $two_days )) && echo rm -r "$f"
done
printf "\n BACKUP_SETS was removed successfully.\n"
fi
该目录包含如下所示的文件夹。
[oracle@ backupset]$ ls -lrt
total 12
drwxr-xr-x 2 oracle dba 12288 Jul 23 18:32 2018_Aug_23
脚本的输出:
[oracle@ backupset]$ ./backupset.sh
BACKUP_SETS was removed successfully.
答案1
您的$BACKUP_SETS[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
通配符与您的目录名称不匹配2018_Aug_23
。
您应该命名您的目录20180823
,然后您的脚本就会看到它。此外,命名月份无法正确比较 ( Apr
< Mar
)。
为了使目录名称更具可读性,您可以将目录命名为2018-08-23
并使用通配符$BACKUP_SETS[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]
。
答案2
正如评论中提到的,您不能使用<
来比较月份名称:
(( '2018-Aug-29' < '2018-Feb-28' )) && echo 'Uh oh, August is before February' || echo 'Sanity prevails'
Uh oh, August is before February
如果您想按词法比较日期字符串,我建议您使用 YYYY-MM-DD 格式。
不过,更好的方法可能是使用find
删除旧目录,而不管命名约定如何:
find "$BACKUP_SETS" -mindepth 1 -maxdepth 1 -type d -mtime +2 -print -exec echo rm -rf {} \;
不用说,echo
当您希望它真正运行时,请删除它。
答案3
find "$BACKUP_SETS" -type f -mtime +2 -exec rm {} \;
find "$BACKUP_SETS" -type d -mindepth 1 -mtime +2 -exec rmdir {} \;
这些目录将在其最新文件几天后被删除。