2014-12-02 83 views
2

以下命令行会删除这些旧的然后180天删除目录,根据目录名称日期

find /path/to/base/dir -type d -ctime +180 -exec rm -rf {} \; 

但是这句法找上了目录的时间戳

例如目录,如果时间戳该目录是

Jan 2 08:17 

那么目录将被删除

,但我要的是根据目录的日期名

例如

目录带有日期的名称要删除的目录:

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 

应予删除,因为它们是按照旧的180天日期名称

请指教如何在我的bash脚本

此言implemente本 - 迪尔南e是日月年占用

+0

这些目录是在一个目录('/ path/to/base/dir')吗?或者它们是否分布在基本目录下的子目录中? – Sithsu 2014-12-02 10:03:28

+0

这个问题似乎是脱离主题,因为它被交叉发布在另一个网站上。 http://unix.stackexchange.com/q/170957/4728 – 2014-12-03 13:32:49

回答

2

试着这样做:

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可以执行外部命令,在这里我得到
  • -exec开关就是可以允许的是
  • --停止的论点
  • {}是为bash调用当前参数,用全路径的文件
  • ${1%/*}删除最后一个领先/后什么:路径(参数扩展)
  • ${1##*/}除去第一/之前什么:目录名(参数扩展)

因此,我将parameter expansions的日期,月份,年份拆分为稍后进行词法比较。如果可以,请始终使用表格YYYYMMDD,这是最容易分类和操作的。您可以测试该命令以确保它做到了您想要的,然后从代码片段中删除echo

0

要删除这是老年人超过180天的所有目录和匹配您的文件名::

find /path/to/base/dir -type d -ctime +180 -name *201* | xargs rm -rf 
+1

dir的时间戳不会比180天大, – maihabunash 2014-12-02 08:09:39

1

这里有一个脚本,将删除所有目录从当前日期早于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