我需要创建一个 bash 脚本,用于删除包含特定日期备份的文件夹。我需要继续执行以下操作:
a) 星期五 23:30 创建的文件\文件夹 b) 月初(每月 1 号)创建的文件\文件夹 c) 最近两周
有什么建议\起点吗?
非常感谢您的意见。
托梅克
答案1
tmpreaper
可能会对你有帮助。你可以使用参数来避免删除某些文件--protect
。
如果你使用如下模式命名备份
<year>-<month>-<day>-<day-of-week>@<hour>:<minute>
你可以使用类似的东西:
tmpreaper [...] --protect 'FRIDAY@23:30' --protect '*-*-01-*' 14d /path/to/backups
看http://manpages.ubuntu.com/manpages/zesty/man8/tmpreaper.8.html
答案2
尝试使用find
。例如,针对过去 14 天内更改过的文件:
find . -mtime -14 -delete
阅读find 的手册页了解更多信息。有很多选项可供使用。或者,对于您正在寻找的更具体的情况,请参阅以下内容:https://stackoverflow.com/a/158235/42580
答案3
其他答案建议根据文件修改时间来执行此操作。这可行,但我想建议一种完全不同的方法来实现您要尝试的操作。
在以今天的日期命名的目录中创建备份(例如,名为 的目录backup-20170516
)。然后,您可以轻松查看哪些备份是在何时完成的,并删除要删除的备份的目录。
即使文件修改时间戳被意外更改,这也能起作用,如果有人使用该touch
命令,或者将文件从一个系统复制到另一个系统而没有正确的选项来保留日期,就会发生这种情况。
backup-yyyymmdd
在 中生成 14 天前的字符串很容易bash
。详细信息请参阅https://stackoverflow.com/questions/13168463/using-date-command-to-get-previous-current-and-next-month
答案4
对于 GNU:
# make a list of files not created on Friday at 23:30 (I would go for 23rd hour)
# also exclude files created on the first of the month
temporary_file=$(mktemp -q /tmp/$0.XXXXXX)
if [ $? -ne 0 ]; then
echo "$0: Can't create temp file, exiting..."
exit 1
fi
ls -l --time-style="+%H___%a___%d" |\
grep -v "23___Fri" |\
grep -v "___1" |\
cut -f 1 | sed -e 's,^,./,' | sort \
> $temporary_file
# Now just older than two weeks; compare with list and exclude
find . -mtime +14 | sort |\
comm -23 - $temporary_file |\
tr "\r" "\0" |\
xargs -0 -n 10 echo
rm $temporary_file
对于 BSD 风格,不要使用 --time-style="+%H___%a",而要使用 -D "+%H___%a" 等。
当你确定它正确时,将 xargs 后的“echo”替换为“rm”。