下面的命令行将删除比180天早的目录
find /path/to/base/dir -type d -ctime +180 -exec rm -rf {} \;
但是这个语法在目录时间戳上查找
例如,如果目录的时间戳是
Jan 2 08:17
那么目录将被删除
但我想要的是根据目录date名称删除目录
例如
目录与date名称:
drwxr-xr-x 2 root root 4096 Dec 2 08:17 01012014 drwxr-xr-x 2 root root 4096 Dec 2 08:17 01022014 drwxr-xr-x 2 root root 4096 Dec 2 08:17 01032014
应该删除,因为它们的date名称超过了180天
请咨询如何在我的bash脚本中实现这一点
注释 – 目录名称是DAYMONTHYEAR
尝试这样做:
find /path/to/base/dir -type d -exec bash -c ' cd ${1%/*} dir=${1##*/} day=${dir:0:2} month=${dir:2:2} year=${dir:4:4} [[ $dir =~ [0-9]{8} && $year$month$day < 20140605 ]] && echo rm -rf "$1" ' -- {} \;
find
可以执行外部命令,这里我产生bash -exec
开关是什么可以允许的 --
是停止争论 {}
是bash
调用的当前参数,具有完整路径的文件 ${1%/*}
删除最后一个/
:路径(参数扩展) ${1##*/}
删除第一个/
之前的内容:dirname(参数扩展) 所以我用bash 参数展开来拆分日,月,年,以后用词汇来比较。 一定要尽可能使用YYYYMMDD格式,最容易分类和操作。 您可以测试命令以确保它能够做到您想要的,然后从代码片段中删除echo
。
这是一个脚本,它将删除当前日期超过180天的所有目录。
即使它们位于其他中间目录内,也会删除匹配的目录。
它也用空格处理中间目录名称。
#!/bin/bash last=$(date -d '-180 days' +%Y%m%d); find /path/to/base/dir -regextype sed -regex ".*[0-9]\{6\}$" -type d | while read d; do x=$(basename "$d") if [[ $last > ${x:4:4}${x:2:2}${x:0:2} ]]; then rm -rvf "$d" fi done
要删除所有超过180天的目录,并匹配您的文件名称::
find /path/to/base/dir -type d -ctime +180 -name *201* | xargs rm -rf