編集する

編集する

これが一般的な質問であることを知っていますが、提供されたソリューションがどのように機能するかを理解していません。すべての人は、日付を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つのファイルを除くすべてのファイルが提供されます。 0mtime
    $ 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日以上)経過したすべてのファイルを削除したいとします。

findfindこのような場合は、次のように(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 {} \;

おすすめ記事