删除名称中包含 YYYYMMDD 超过 N 天的子目录

删除名称中包含 YYYYMMDD 超过 N 天的子目录

我有一个目录,其中每天创建子目录,字面意思是根据$date.如何删除超过 7 天的文件夹及其内容根据文件名中的YYYYMMDD而不是元数据日期?假设我有(为简洁起见,跳过了一些):

20170817
20170823
20170828
20170901

我最终会得到以下文件夹(这些文件夹应该保留):

20170828
20170901

我创建了一个保存 7 天前日期的变量: dt_prev=$(date -d "`date`-7days" +%Y%m%d)

我的想法是ls -l列出这些文件夹名称并逐行比较,但这涉及清理该列表等,我认为必须有一种更简单的方法。

答案1

我认为解决方案是一个更简单的版本格伦·杰克曼 发布,例如

seven_days=$(date -d "7 days ago" +%Y%m%d)
for f in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]; do
   [ -d "$f" ] || continue
   (( $f < $seven_days )) && echo rm -r "$f"
done

echo如果结果看起来正确,请删除。

-d测试确保我们只检查(删除)目录。

答案2

你不应该解析ls,你可以这样做:

for f in *; do test "$f" -lt "$date" && do something; done

对于您的示例,对于以下目录和date=20170825

$ ls
20170817  20170823  20170828  20170901
$ for f in *; do test "$f" -lt "$date" && echo "$f"; done
20170817
20170823

答案3

使用单个find命令:

date_week_ago=$(date -d "7 days ago" +%Y%m%d)
find . -type d -regextype posix-extended -regex '.*/[0-9]{8}$' \
       -exec bash -c 'd=$(basename {}); (( '$date_week_ago' > $d )) && rm -rf "$d"' \;

答案4

只需使用find命令即可。

find . -type d ! \( -name "$(date -d "-7 days" +%Y%m%d)" \
    $(eval printf "%s" "\" -o -name \
   \$(date -d -"{6..0}"days +%Y%m%d)\"") -o -name . \) -exec rm -rf -- '{}' +
  • 仅有的d愤怒-type d
  • 仅限董事姓名年龄超过 7 天的董事。
  • rm -rf -- '{}'立即删除该目录及其内容+

相关内容