我是linux脚本的新手,我之前从未创建过.sh文件。 我需要创建一个脚本,删除上个月的所有文件。 我已经完成了
find /path/to/files* -mtime +5 -exec rm {} \;
但由于一个月内的天数可能在30到31天之间变化,因此无用。 请帮我解决这个问题。感谢
答案 0 :(得分:0)
嗯,首先 - 上个月你的清洗有多重要?我的意思是 - 如果你在5月1日运行你的脚本,你真的希望从昨晚删除文件吗?
对于大多数用途 - find -mtime +30
就足够了,因为它是一个滚动的30d窗口。
然而,如果你真的想要'上个月和更老',那么你必须更有创意,因为Unix可以在时间戳上工作 - 只需几秒钟。 30秒是一个固定的窗口,但正如你所说 - 1个日历月不是。
如果你记住“上个月”也可能也是“去年”,情况会变得更糟。
一个月前准备好了:
perl -MTime::Piece -e 'print localtime -> add_months(-1);'
将其转换为Unix时间戳:
perl -MTime::Piece -e 'print localtime -> add_months(-1) -> epoch;'
实际上要弄清楚上个月开始的时间戳稍微复杂一点 - 最简单的方法可能就是做上面的事情,然后“弄清楚”第一天的时间戳。
E.g。
perl -MTime::Piece -e 'print localtime->strptime(localtime->add_months(-1)->strftime("%Y%m"),"%Y%m);'
我们从今天开始减去1个月,将其重新格式化为“年/月”,然后重新解析“年/月”,没有一天可以获得该月的第一天。
答案 1 :(得分:0)
强制性bash解决方案。从包含要删除的文件的工作目录中,您可以运行此
for i in $(ls -al | awk '/May/{print $NF}'); do rm -rf $i; done
它将明确匹配5月份创建的所有文件,然后将其删除。
ls -al命令列出带有日期的文件,然后awk命令匹配日期为May的文件,然后只输出文件名。您可以在通过运行此
来拉动扳机之前测试它ls -al | awk '/May/{print $NF}'
一旦确定找到的文件是您要删除的文件,就可以运行for循环删除它们。
答案 2 :(得分:0)
运行以下命令删除工作目录中的上个月文件。
1,你可以看到工作目录中的最后一个蛾文件运行
sudo find . -mtime +30
可以将数字参数指定为 + n表示大于n, -n小于n, n恰好是n。
sudo find . -mtime +30 -delete
删除您可以运行的系统中的所有文件,如下所示
sudo find / -mtime +30 -delete