脚本详细信息:

脚本详细信息:

我创建了一个脚本,该脚本应该删除目录及其内容早于 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 {} \;

这些目录将在其最新文件几天后被删除。

相关内容