これが一般的な質問であることを知っていますが、提供されたソリューションがどのように機能するかを理解していません。すべての人は、日付を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 {} \;
。
答え2
man find
, -時間:
...したがって、-atime +1と一致するには、少なくとも2日前にファイルにアクセスする必要があります。
オプション-daystart
変更説明:
-daystart
Measure times (for -amin, -atime, -cmin, -ctime, -mmin, and -mtime)
from the beginning of today rather than from 24 hours ago.
touch -d '2019-11-19 0800' thismorning
テストファイルを簡単に作成できます。
]# find -name '*n*g*' -daystart -mtime 0 -ls
Nov 19 08:00 ./thismorning
]# find -name '*n*g*' -daystart -mtime 1 -ls
Nov 18 22:30 ./lastnight
Nov 18 08:30 ./lastmorning
]# find -name '*n*g*' -mtime 0 -ls
Nov 18 22:30 ./lastnight
Nov 19 08:00 ./thismorning
]# find -name '*n*g*' -mtime 1 -ls
Nov 17 22:00 ./lastlastnight
Nov 18 08:30 ./lastmorning
(-ls出力フィールドを切り捨てました。日付とファイル名のみが残ります)
]# find -name '*n*g*'; date
./lastnight
./thismorning
./lastlastnight
./lastmorning
Tue Nov 19 10:34:33 UTC 2019
]# find -name '*n*g*' -daystart -mtime 2 -ls
Nov 17 22:00 ./lastlastnight
]#
...OPでカレンダーの日付と24時間の期間を混同したからです。私たちはこれが欲しい時もあり、それが欲しい時もあります。
なぜエポックから数秒が経過したのですか?
何がどれくらい続いたか、つまり2つの日付の違いを知りたい場合は、私たちのカレンダーにこれらの不規則性(月)があります。そのため、指の関節を使ってユリウス皇帝とアウグストゥス皇帝について学ぶか、無差別代入で数秒を過ごしてください。
30.7から始まります。 1.9へ。 30.1より3日長くなりました。 1.3.までであり、うるう年にも依存します。
today, 5:30 pm
そしてtomorrow 6:00 am
- 他の曜日(カレンダー方式)
- 半日間隔(1日= 24x60x60秒期間)
有効期限から計算したい24時間期間を減算します。これは午前1時にほとんどの「昨日」が影響を受けないことを意味します。
date
コマンドをテストして修正しました。
]# date -d "-1 day" +%s
1574003538
]# date -d "-0 day" +%s
1574089945
違いは86407、つまり24×60×60です。
(誰かが私に「何をしていますかdate -d @1574089945
?」と尋ねると、私は「コマンドを編集しています」と言うことができます。7秒")
]# find . -atime 1
./here.sh
]# find . -atime +0 -atime -2
./here.sh
]# ls -l here.sh
-rw-r--r-- 1 root root 154 Nov 16 21:37 here.sh
それはNov 18 16:43
。したがって、両者の間には完全な24時間の期間があります。