参照ファイルより古いすべてのファイルを見つけるには、次のコマンドを使用しています。
find /home/testuser -name "dummyfiles*" ! -newer referencefile.txt
...予想通りに動作します。
しかし、参照ファイルよりも数時間古いファイルだけを検索するように、時間についてもう少し余裕があります。
たとえば、変更日の参照ファイルがある場合は、May 26 11:26
次の古いファイルを探したいと思いますMay 26 9:26
(つまり、参照ファイルに対して2時間の猶予期間があります)。
この例では、以下は正しい一致です。
May 26 7:00
Apr 15 14:00
...次はいいえマッチ...
Jun 13 9:00
May 26 10:00
最終的に見つかったすべてのファイルを削除したいのですが、find
その要件を満たしている場合は気に入りますか?それ以外の場合、あまりにも複雑ではなく、これらのファイルを削除する他の選択肢はありますか?
答え1
GNUシステムでは、次のことができます。
TZ=UTC0 find /home/testuser -name "dummyfiles*" ! -newermt "$(
TZ=XXX2:00:00 date -r referencefile.txt +%FT%T.%N)"
つまり、date
UTCより2時間後のタイムゾーンでファイル修正を印刷し(したがってファイルがUTC 15:00に最後に変更された場合に印刷されます)、そのタイムdate
スタンプ13:00
をfind
UTC時間として解釈します(したがって、この例では次のものを見つけようとします) )。 UTC 13:00より前に最後に変更されたファイル)。
オフセットは最大24時間(TZ=XXX-24
または使用する場合は48時間find
)に制限されます。任意オフセットの場合は、次のことができます。
(
export TZ=UTC0
find /home/testuser -name "dummyfiles*" ! -newermt "$(
date -d "$(date -r referencefile.txt +%FT%T.%N) - 2 hours" +%FT%T.%N)"
)
または、次のものを使用できますperl
。
perl -MFile::Find -le '
$min_age = (-M "referencefile.txt") + 2/24;
find (sub {
print $File::Find::name if $_ =~ /^dummyfiles/ && (-M$_) > $min_age
}, @ARGV)
' -- /home/testuser
find
GNU(しかしGNUに似ているdate -r
)とは異なり、シンボリックリンクの場合、シンボリックリンク自体の寿命ではなく、リンクされたファイルの寿命をperl
考慮します。-M
タイムスタンプの1秒未満の部分も考慮されません。
答え2
この試み:
find /home/testuser -name "dummyfiles*" ! -newer referencefile.txt -mmin +120 -print
パラメータ-mmin +120
findコマンドを追加すると、referencefile.txtの変更日と比較して2時間より古いファイルのみが返されます。
テスト:
mkdir find
touch find/dummyfiles1 find/dummyfiles2 find/dummyfiles3 find/dummyfiles4 find/referencefile.txt
touch -t 8001031305 dummyfiles1 dummyfiles2
find find/ -name "dummyfiles*" ! -newer find/referencefile.txt -mmin +120
出力:
検索/ダミーファイル1
検索/ダミーファイル2