簡體   English   中英

遞歸刪除文件和文件夾

[英]Delete files & folders recursively

我有太多的文件和文件夾。 他們有這樣的語法

/ opt / logs / qnap / [hosta,hostb] / 2012/03/12

Qnap數據存儲上的所有日志文件都在另一個位置。 因此,當我要刪除超過180天的文件和文件夾時,由於速度緩慢,無法使用find命令。 所以我寫了這樣的腳本。

SixMonthAgo=$(date --date='190 day ago' "+%Y/%m/%d/%H")  = 2011/06/12/12
Hosts="hosta hostb"
maxDay=181
qnapFolder="/opt/logs/qnap"

for host in $(echo "${Hosts}"); do
        maxDayAgo=$(date --date="${maxDay} day ago" "+%Y/%m/%d")
        countCharacters=$(echo ${maxDayAgo} | wc -c)
        if [ ${countCharacters} -ge 10 ]; then
                rm -rf ${qnapFolder}/${host}/${maxDayAgo} #output of this just like 2012/03/12
        fi
done

但是有時候我會出錯。 此解決方案無法正常運行我想要的。 我想在180天之前刪除所有文件和文件夾。 我怎樣才能做到這一點 ? 例如,必須在2012/03/23之前刪除所有文件和目錄。

提前致謝

find命令很慢? 你確定嗎? 唯一的缺點是它無法刪除目錄結構。

find /opt/logs/qnap -type f -mtime +180 -delete

如果確實在同一時間創建目錄,則刪除-type f可能對您-type f

find /opt/logs/qnap -mtime +180 -delete

find是一個非常快速的主意...但是如果您真的想使用shell腳本來實現...

CUTOFF=$(date --date='190 day ago' "+%s)
HOSTS="hosta hostb"
DIRECTORY="/opt/logs/qnap"

for HOST in $(ls -1 $DIRECTORY); do
    if [ -d $DIRECTORY$HOST ]; then
        for DATE in $(ls -1 $DIRECTORY$HOST); do
            if [ -d $DIRECTORY$HOST$DATE ]; then
                if [ "$CUTOFF" < "$(stat --format="%Y" $DIRECTORY$HOST$DATE)" ]; then
                    echo "Deleting $DIRECTORY$HOST$DATE"
                    rm -rf $DIRECTORY$HOST$DATE;
                fi
            fi
        done
    fi

我已經找到了下面的解決方案。 例如,假設比180天前的日期是2012/04/17。 這只會刪除從2012/04/17到2012/04/01的所有目錄。 其次,它會在2012/04之前每月刪除一次。 刪除的是2012 / 03、2012 / 02和2012/01。

# SixMonthAgo=$(date --date='190 day ago' "+%Y/%m/%d/%H")  = 2011/06/12/12
maxDay=104
qnapFolder="/opt/logs/qnap"
for host in $(echo "${Hosts}"); do
    maxDayAgo=$(date --date="${maxDay} day ago" "+%Y/%m/%d")
    countCharacters=$(echo ${maxDayAgo} | wc -c)
    if [ ${countCharacters} -ge 10 ]; then
        year=$(echo ${maxDayAgo} |cut -d '/' -f 1)
        month=$(echo ${maxDayAgo} |cut -d '/' -f 2) #2012/06
        day=$(echo ${maxDayAgo} |cut -d '/' -f 3) #2012/06/04

        minday=00
        minmonth=00
        until [ $month -le $minmonth ]
        do
            until [ $day -le $minday ]
            do
                rm -rf ${qnapFolder}/${host}/2012/$month/$day
                    day=$(printf "%02d" $(expr $day - 01)) 

            done        

                    month=$(printf "%02d" $(expr $month - 01))
            rm -rf ${qnapFolder}/${host}/2012/$month
        done
    fi
done

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM