2014-12-02 61 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