UNIXのフォルダから60日以上経過したファイルを削除する方法は?

UNIXのフォルダから60日以上経過したファイルを削除する方法は?

変更後60日以上のファイルを削除する方法を知っていますが、ファイル名のタイムスタンプに基づいてファイルを削除したいと思います。

たとえば、毎月毎日次のファイルがあり、過去3年間のファイルがあります。

vtm_data_12month_20140301.txt
vtm_data_12month_20140301.control
vtm_mtd_20130622.txt
vtm_mtd_20130622.control
vtm_ytd_20131031.txt
vtm_ytd_20131031.control

60日より古いすべてのファイル(ファイル名に基づいて)を見つけて、毎月最後のファイルを除くすべてのファイルを削除するスクリプトを作成したいと思います。たとえば、1月にはを除くすべての項目を削除したいと思いますvtm_data_12month_20140131.txt。ここでの問題は、1月30日に基づいてファイルを受け取る可能性があるため、その場合は最新のファイルを削除しないでください。残りも削除する必要があります。

シェルスクリプトでこれを達成する方法を教えてください。

ベストアンサー1

さて、逆さまにソートするようにスクリプトを書き直しましたが、うまくいくようです。年と月を前の年と比較して低い場合は、その月の最後の項目でなければなりません。

#!/bin/bash

#the tac reverses the listing, so we go from newest to oldest, vital for our logic below
FILES=`ls | tac`

#create a cutoff date by taking current date minus our 60 day limit
CUTOFFDATE=`date --date="60 days ago" +%Y%m%d`

#we are setting this value to month 13 of the current year 
LASTYEARMONTH=`date +%Y`13

for file in $FILES; do

    #get datestamp
    FILEDATE=`expr match "$file" '.*\(20[0-9][0-9][0-9][0-9][0-9][0-9]\)'`

    #get year and month, ie 201410
    THISYEARMONTH=${FILEDATE:0:6}

    if [ ! -z $FILEDATE ] && [ $THISYEARMONTH -lt $LASTYEARMONTH ]; then

            echo "$file IS THE LAST FILE OF THE MONTH. NOT DELETING"

    else

            #now we see if the file is older than 60 days (ie, has a LOWER unix timestamp than our cutoff)
            if [ ! -z $FILEDATE ] && [ $FILEDATE -lt $CUTOFFDATE ]; then

                    echo "$file has a file date of $FILEDATE which is older than 60 days."

                    #uncomment this next line to remove
                    #rm $file
            fi
    fi
    LASTYEARMONTH=$THISYEARMONTH
done

おすすめ記事