dateコマンドの「1ヶ月前」オプションはどのように機能しますか?

dateコマンドの「1ヶ月前」オプションはどのように機能しますか?

現在の日付内で過去の日付を取得できるのか、それとも30日か31日だけが必要かはわかりません。

例えば

現在の日付がMarch 28th1ヶ月前であれば、February 28th1ヶ月前に何が起こりましたかMarch 30th

想像する

$(date +%Y%m%d)毎日いくつかのファイルをバックアップしたいです。スクリプトは、これらのファイルを現在の日付内の形式で保存します。たとえば、20150603_bckp.tar.gz次の月が来ると、1日と15日のファイルを除いて、1か月前のすべてのファイルが削除されます。だからここに私はケースがあります:

past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
    rm /path/of/files/${past_month}_bckp.tar.gz
    echo "Depuration done"
else
    echo "Keep file"
fi

しかし、日付が30日、31日、または過去2月であった場合はどうなりますか?そのファイルは保存されますか?それとも最初の日からファイルを削除しますか?

31日になるとPurgeをすることになるが、先月が30日しか残っていなかった場合、1日目からファイルが削除されるのでしょうか?

私がそれを暗示したら良かったでしょう。

答え1

- 1 month月番号から1を引いた後、結果の日付が無効な場合(たとえばFebruary 30)有効になるように調整されます。また、11月の日でDecember 31 - 1 monthはなく、(うるう年に実行されない限り)そうです。December 1March 31 - 1 monthMarch 3

ここに引用された内容は情報ページGnu datedateこの構文を実装するバージョン)の場合、算術をより強力にするための良い提案が含まれています。

ユニットがあいまいな場合、関連プロジェクトに問題が発生する可能性があります。たとえば、2003-07-31 -1 month2003-06-31は無効な日付であるため、2003-07-01として計算できます。前月をより確実に確認するには、今月15日前の月をリクエストできます。たとえば、

    $ date -R
    Thu, 31 Jul 2003 13:02:39 -0700
    $ date --date='-1 month' +'Last month was %B?'
    Last month was July?
    $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
    Last month was June!

情報ページでも引用されている別の警告:

また、時計の変更(たとえば、夏時間のジャンプなど)に合わせて日付を操作するときは注意してください。場合によっては、時計に24時間を加算または減算するため、TZカレンダーの計算を開始する前に環境変数をに設定して標準時を採用することが賢明なことがよくあります。UTC0

答え2

バックアップファイルを削除するためにファイル名に頼るよりも一時的なメタデータに頼る方が安全です。

たとえば、次のコマンドを使用すると、30日以上経過したすべてのファイルを削除できます。

/usr/bin/find /path/to/your/files -type f -ctime +30 -delete

無料ボーナスでこのプログラムを毎日実行すると、1か月間バックアップファイルを保存でき、ディスク容量の管理が向上します。

1番目または15番目のファイルを保存するには、そのファイルを別のディレクトリに保存するか、-not -nameオプションを使用してfindコマンドを更新できます。

答え3

次のように、日付がどのように機能するかを確認できます。

date -d "$(date -d "Mar 31 2019" +%F) +1 month ago"
Sun Mar  3 00:00:00 EET 2019

それで先月、今月(3月なら現在ではない)を基準に、今月から先月の日数を減らしてみようかと思いました。

次の構文を使用して、数日(下の例では31日)より古いファイルを削除できます。 1行で問題を解決してください(簡単な方法です)。

find /path/to/folder/with/arhives/ -mindepth 1 -mtime +31 -delete

より詳細なアプローチのために、次のこともできます。 1. 今月の日数を探します。

cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}'
  1. 先月の日数を求めます。

    echo "$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')-"$( cal $(date -d "+1ヶ月前" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | awk '{print $NF}') |

  2. 今、私たちはこの2か月の違いを見つけました。

    echo "$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')-"$( cal $(date -d "+1ヶ月前" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | awk '{print $NF}') |

それでは、このステップ3にいくつかの変数を割り当ててみましょう。 1段階変数名:FCM 2段階変数名:FLM 3段階変数名:DCL

FCM=$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
FLM=$(al $(date -d "+1 month ago" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
DCL=$(echo "$FCM-$FLM" | bc)

$ DCLが0(ゼロ)であることを確認し、$ FCMと$FLMの違いに従って削除します。

if [ $DCL -ne 0 ]; then
    if [ $DCL -lt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    elif [ $DCL -gt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    fi
else
    find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$FLM -delete
fi

「/path/to/folde/with/arhives/」に変数を追加することもできます。

結論:(正確に)1か月前のファイルを削除するには、「+ 1ヶ月前」と一緒に「date」コマンドを使用して正確な日数を調整する必要があります。

関連情報