web-dev-qa-db-ja.com

Linuxで2つの日付の違いを取得するにはどうすればよいですか?

これがよくある質問であることは知っていますが、提供されたソリューションがどのように機能するかを理解していません。日付をエポックから秒に変更してから(24 * 3600)で割って、日数の差を求めることをお勧めします。または使用する

if [ $first_date -gt $second_date ]

しかし、私が理解していないのは、エポックから秒を使用するという明白な間違いに、1日以内でも異なるという点で誰も気付かない理由です。または、特定の日の午後5時30分と翌日の午前9時を考慮した場合、秒の差が24時間のギャップにつながることはないため、誤って同じと見なされます。日。

私の使用シナリオは次のとおりです。指定された日数より古いログを削除する必要があります。したがって、ユーザーが日数を入力した後に作成するexpiration_dateは次のとおりです。

expiration_date=$(date -d "-$1 day" + %s)

次のようにstatコマンドを使用して取得したファイル変更日:

file_date=$( stat -c %Y $entry )

これらの2つの日付を比較し、ファイルの変更日が有効期限より「短い」場合はそれらを削除する必要があります。この点で私を助けてください。

編集

Findコマンドのmtime引数の使用に関して私は本当に混乱しています。次のファイルがあると考えてみましょう。

Nov15_1 Nov15_2 Nov17_1 Nov17_2 Nov18_1 Nov18_2 Nov19_1 Nov19_2

11月19日にmtime引数として「0」を使用してfindコマンドを実行すると、最初の4つを除くすべてのファイルが表示されます。

find /dir/ -type f -mtime 0 -name "Nov*"

Nov18_1 Nov18_2 Nov19_1 Nov19_2

また、「+ 0」を使用して実行すると、最初の4つのファイルしか表示されません。

find /dir/ -type f -mtime +0 -name "Nov*"

Nov15_1 Nov15_2 Nov17_1 Nov17_2

これを変数を使用して表現すると、月のn日目からログを削除し、mtimeを+0として(n + 1)日目にコマンドを実行します。これは、「 「1日後」では、実際には(n-1)日以降、つまり「2日後」からファイルを取得しています。これは、1日後のファイルだけを取得する方法がないことを意味しますか? 「0」の議論は、それを今日のファイルとも混ぜ合わせています。

編集

そこで、@ AdminBeeが指摘した-daystartオプションを組み込みましたが、結果は私の期待どおりです。ここで、(n + 1)日目にコマンドを実行して、n日目以前のログを削除しようとすると、コマンドは次のようになります。

 find /dir/ -type f -daystart -mtime +0 -name "Nov*"

ファイル変更のタイムスタンプが今から24時間以内であるかどうかに関係なく、前日のファイルが1日遅れていると見なされ、その前にある他のすべてのファイルも一覧表示されます。

1
abhishek

おそらく、実際のユースケースの詳細を提供する必要があります。クリーンアップスクリプトを毎日実行していて、たとえば5日(つまり6日前以前から)古いファイルをすべて削除したいとします。

このような状況では、find(ここではGNU findまたは互換性があると仮定)を使用して、条件付きファイル検索と削除操作を1つのコマンドに組み合わせることができます。

find /start/of/logfile/dir/structure ! -type d -daystart -mtime +5 -delete

これは、現地時間2019-11-16 22:54:12に実行された場合、最終変更時刻が2019-11-11 00:00:00より前の非ディレクトリファイルを削除します(したがって、10番目以降のファイル)。

このfindコマンドの-daystartオプションは、目的の動作を実現するはずであることに注意してください。操作を特定のファイル名部分に制限する必要がある場合は、-name <pattern>を追加する必要があります(cf. ドキュメントはGNU find )。

また、マシンにインストールされているfindのバージョンによっては、-delete操作 使用できない場合があります であるため、代わりに-exec rm {} \;を使用する必要がある場合があることに注意してください。 。

1
AdminBee