![删除名称中包含 YYYYMMDD 超过 N 天的子目录](https://linux22.com/image/117228/%E5%88%A0%E9%99%A4%E5%90%8D%E7%A7%B0%E4%B8%AD%E5%8C%85%E5%90%AB%20YYYYMMDD%20%E8%B6%85%E8%BF%87%20N%20%E5%A4%A9%E7%9A%84%E5%AD%90%E7%9B%AE%E5%BD%95.png)
我有一个目录,其中每天创建子目录,字面意思是根据$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 -- '{}'
立即删除该目录及其内容+