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

fre*_*nto 11 bash sh

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

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

 find /path/to/files* -type f -mtime +30 -delete
Run Code Online (Sandbox Code Playgroud)

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

Sto*_*ica 13

@ JoSo答案稍微简单且更谨慎的版本:

find /path/to/files -type f -mtime +30 \
    -exec sh -c 'test $(date +%a -r "$1") = Mon || echo rm "$1"' -- {} \;
Run Code Online (Sandbox Code Playgroud)

差异:

  • 使用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"' -- {} \;
Run Code Online (Sandbox Code Playgroud)


Jo *_* So 6

find我所知,没有工作日检查,你需要打电话给外部程序.

find /path/to/files -type f -mtime +30 \
    -exec sh -c \
        '[ "$(date +%u -d @"$(stat -c %Y "$1")")" != 1 ] && rm "$1"' -- {} \;
Run Code Online (Sandbox Code Playgroud)

更新:使用-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
Run Code Online (Sandbox Code Playgroud)