根据目录名称删除目录date

下面的命令行将删除比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