これが一般的な質問であることを知っていますが、提供されたソリューションがどのように機能するかを理解していません。すべての人は、日付をepochから秒単位で変更し、(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つの日付を比較し、ファイル変更日が有効期限よりも「前」の場合は、それを消去する必要があります。この点について私を助けてください。
編集する
mtime
コマンドパラメータの使用法は非常に混乱していますfind
。次のようなファイルがあるとしましょう。
Nov15_1
Nov15_2
Nov17_1
Nov17_2
Nov18_1
Nov18_2
Nov19_1
Nov19_2
- 今11月19日にasパラメータを
find
使用してコマンドを実行すると、最初の4つのファイルを除くすべてのファイルが提供されます。0
mtime
$ 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
mtime
変数を使用してこれを表す場合は、毎月n日前のログを消去し、asを使用して(n + 1)日にコマンドを実行すると仮定すると、+0
これも「1日前」に変換する必要があります。 「追加」を選択すると、実際には(n-1)日、つまり「往復2日」からファイルがインポートされます0
。今日の文書と一緒に。
編集する
-daystart
そこで@AdminBeeが指摘したオプションを統合しましたが、結果は予想通りです。 n日前のログを削除するために(n + 1)日にこのコマンドを実行すると、コマンドは次のようになります。
find /dir/ -type f -daystart -mtime +0 -name "Nov*"
ファイルの変更タイムスタンプがこれから24時間以内であるかどうかにかかわらず、前日のファイルは1日遅れていると見なされ、他のすべてのファイルも一覧表示されます。
ベストアンサー1
実際のユースケースの詳細を提供する必要があるかもしれません。毎日クリーンアップスクリプトを実行し、5日以上(つまり6日以上)経過したすべてのファイルを削除したいとします。
find
find
このような場合は、次のように(GNUまたは互換仮定)を使用して、条件付きファイルの検索と削除操作を単一のコマンドにまとめることができます。
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日前のファイル)。
-daystart
このコマンドのオプションは必要なfind
動作を達成する必要があります。ジョブを特定のファイル名部分に制限する必要がある場合は、次の項目を追加する必要があります-name <pattern>
(参照GNUドキュメントfind
)。
find
また、コンピュータにインストールされているバージョンに応じて-delete
、利用できない場合がありますだから、代わりにそれを使用する必要があるかもしれません-exec rm {} \;
。