我有很多每日备份档案。为了管理磁盘使用情况,我需要一个bash脚本,它将删除超过1个月的所有文件,但保留所有文件在星期一创建,即使它们超过1个月。
例如,这将删除30天前修改的所有文件:
find /path/to/files* -type f -mtime +30 -delete
但我真的不知道如何保存星期一创建的文件。
答案 0 :(得分:13)
@ JoSo的答案稍微简单且更加谨慎:
find /path/to/files -type f -mtime +30 \
-exec sh -c 'test $(date +%a -r "$1") = Mon || echo rm "$1"' -- {} \;
差异:
date -r
直接获取文件的最后修改日期%a
处理更易于理解的工作日名称rm "$1"
以查看将要删除的内容。如果看起来不错,那么要么在最后粘贴| sh
来真正执行,要么删除echo
但是,@ JoSo指出date +%a
依赖于语言环境是正确的,因此这些版本确实更安全:
find /path/to/files -type f -mtime +30 \
-exec sh -c 'test $(date +%u -r "$1") = 1 || echo rm "$1"' -- {} \;
find /path/to/files -type f -mtime +30 \
-exec sh -c 'test $(LC_TIME=C date +%a -r "$1") = Mon || echo rm "$1"' -- {} \;
答案 1 :(得分:6)
据我所知,find
没有工作日检查,您需要拨打外部程序。
find /path/to/files -type f -mtime +30 \
-exec sh -c \
'[ "$(date +%u -d @"$(stat -c %Y "$1")")" != 1 ] && rm "$1"' -- {} \;
更新:使用-r
切换到date
(Kudos到Janos)并且只测试,而不是在shell命令中删除可能会产生最干净的版本:
find /path/to/files -type f -mtime +30 \
-exec sh -c 'test "$(date +%u -r "$1")" != 1' -- {} \; \
-print # or -delete instead
答案 2 :(得分:0)
你可以使用
stat -c %y yourfile
获取文件的创建日期。
然后使用cut提取日期,使其具有类似myvar = yyyymmdd
的var最后使用
date +%u --d $myvar
date +%u --d 20130822
它将返回星期几,如果它返回1则是星期一。 在我的情况下它返回4因为2013年8月22日是星期四
编辑:如果你能像Jo So建议的那样将所有这些作为一个简单的命令行工作,那就更好了!
答案 3 :(得分:0)
如何避免循环中的子进程:
lambda