bash:删除超过1个月的所有文件,但保留星期一的文件

时间:2013-11-17 18:19:17

标签: bash sh

我有很多每日备份档案。为了管理磁盘使用情况,我需要一个bash脚本,它将删除超过1个月的所有文件,但保留所有文件在星期一创建,即使它们超过1个月。

例如,这将删除30天前修改的所有文件:

 find /path/to/files* -type f -mtime +30 -delete

但我真的不知道如何保存星期一创建的文件。

4 个答案:

答案 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