0

たくさんのファイルとフォルダーがあります。このパスのような構文があります

/opt/logs/qnap/[ホスタ、ホストb]/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 より前のすべてのファイルとディレクトリを削除する必要があります。

前もって感謝します

4

2 に答える 2

3

検索コマンドが遅い?確かですか?唯一の欠点は、ディレクトリ構造を削除できないことです。

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

ディレクトリが実際に同時に作成された場合は、削除する-type fとうまくいく可能性があります。

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

find は非常に高速です...しかし、本当にシェルスクリプトでやりたい場合は...

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
于 2012-09-23T12:50:10.343 に答える
0

以下のような解決策を見つけました。たとえば、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

ありがとう

于 2012-09-23T15:02:23.030 に答える