我有一个目录,其中有一堆以yyyy-MM-dd
格式命名的文件夹。我想删除所有yyyy-MM-dd
字符串早于X天的文件夹。
# ls
2018-01-01
2018-01-02
2018-01-03
...
2018-02-01
2018-03-05
...
2019-01-02
2019-01-02
有可能找到这样的东西吗?
更新:
此问题不是Delete files older than specific date in linux的重复,因为它涉及按mtime
查找文件,我想按文件名查找与日期字符串匹配的文件。例如,目录名称可以是2012-01-01
,但它的mtime
可以是2018-03-11
。这就是mtime
或其他任何日期/时间元数据无法满足我的需求的原因。
答案 0 :(得分:2)
您可以通过以下方式获取自UNIX时代以来的天数:
echo $(($(date +%s)/86400))
您可以对格式与上面相同的字符串进行相同的操作:
echo $(($(date +%s --date "2018-01-01"))/86400)
然后是“今天”和任意日期之间的天数:
echo $(($(date +%s)/86400 - $(date +%s --date "2018-01-01")/86400))
将其循环包装,您应该会很好:
for DIR in `ls -1`
do
# if the directory name is parseable as a date...
if date "$DIR" &>/dev/null
then
age=$(($(date +%s)/86400 - $(date +%s --date "$DIR")/86400))
echo "$DIR is $age days old"
# do something based on its age
if [ $age -gt 30 ]
then
#rm -fr "$DIR"
echo $DIR
fi
fi
done
答案 1 :(得分:0)
如前所述,bash不支持内置的日期和时间功能。
尽管date
命令有时对于补偿它很有用,但该命令
有很多差异,通常会导致兼容性问题。
建议使用其他编程语言
本机支持日期和时间算术。
这是python中的示例:
#!/usr/bin/python
import glob
import re
import datetime
import shutil
import os
retention = 100 # or whatever period you want to preserve
now = datetime.datetime.now()
for dir in glob.glob("*-*-*"):
if re.search("^\d{4}-\d{2}-\d{2}$", dir):
dt = datetime.datetime.strptime(dir, "%Y-%m-%d")
if ((now - dt).days > retention):
shutil.rmtree(dir)
希望这会有所帮助。