web-dev-qa-db-ja.com

bashスクリプトで2つの日付を比較する方法は?

今日の日付をファイルの最終更新日と比較しようとしています。

DATE=$(date +"%F")

LASTMOD=$(stat $i -c %y);
LASTMOD_DATE=$(cut -d' ' -f1 <<<"$LASTMOD")

if [ "$LASTMOD_DATE" -ge "$DATE" ]; then
    printf "%-19s | " "$DATE"
else
    printf "%-19s | " "NO RECENT MOD"
fi

現在、これはそれらを適切に比較していません。LASTMOD_DATEは実際には日時ではないため、「整数式が必要です」というエラーが発生するためと考えられます。

1
Austin

タイムスタンプ形式date +%sおよび-rオプションを使用できます。

-r, --reference=FILE
         display the last modification time of FILE

お気に入り

if [ $(date +%s -r file) -ge $(date +%s) ]; then 
    # do something
fi
2
Freddy

時点(日付)を比較する最良の方法は、秒単位です(エポック以降)。

Statの%y%Yに変更すると、ファイルの変更日が秒単位で表示されます。

fileModifiedOn=$(stat $i -c %Y)

今日の日付は、%s形式の(GNU)日付で読み取ることができます。

todayDate=$(date +'%s')

または、Bash 5.0では、変数EPOCHSECONDSを使用します。

todayDate=$EPOCHSECONDS

または、古いbashでは、(組み込みの)printf形式を使用します。

todayDate=$(printf '%(%s)T')

次に、それは単純な整数比較の問題です:

if [[ "$fileModifiedOn" -gt "$todayDate" ]] then
    result=$todayDate
else
    result="NO RECENT MOD"
fi

printf "%-19s | " "$result"
1
Isaac