シェルスクリプトでファイルの最終更新からの経過日数を取得する

シェルスクリプトで/path/to/fileというパスにあるファイルの最終更新からの経過日数を取得するには以下のようにする。

days=$(($(($(date +%s) - $(date -r /path/to/file +%s))) / 86400))
echo $days

以下それぞれの部分の解説。

$(date +%s)

$(コマンド)の形式でコマンドの実行結果を変数に代入できる。(コマンド置換)

dateコマンドを+%sでフォーマットするとUnix時間を取得できる。

$ date +%s
1697805102

これで現在の時間をUnix時間で取得できる。

$(date -r /path/to/file +%s)

dateコマンドに-rオプションを付けると指定したファイルの最後に更新した時間を取得できる。
上記と同じく+%sでフォーマットしているのでUnix時間で取得している。

$ date -r /path/to/file +%s
1688296179

$((式))

$((式))の形式で数式を評価できる。

$ echo $((1 + 2))
3

$(($(date +%s) - $(date -r /path/to/file +%s)))で「現在の時間 - ファイルの最後の更新時間」を計算している。

$ echo $(($(date +%s) - $(date -r /path/to/file +%s)))
9509131

得られる結果は秒なので$((式 / 86400))で日数に変換している。

$ echo $(($(($(date +%s) - $(date -r /path/to/file +%s))) / 86400))
110