特定のファイルより数時間古いファイルを探す

特定のファイルより数時間古いファイルを探す

参照ファイルより古いすべてのファイルを見つけるには、次のコマンドを使用しています。

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)"

つまり、dateUTCより2時間後のタイムゾーンでファイル修正を印刷し(したがってファイルがUTC 15:00に最後に変更された場合に印刷されます)、そのタイムdateスタンプ13:00findUTC時間として解釈します(したがって、この例では次のものを見つけようとします) )。 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

findGNU(しかしGNUに似ているdate -r)とは異なり、シンボリックリンクの場合、シンボリックリンク自体の寿命ではなく、リンクされたファイルの寿命をperl考慮します。-Mタイムスタンプの1秒未満の部分も考慮されません。

おすすめ記事