web-dev-qa-db-ja.com

秒単位で時間を設定(検索)する方法は?

設定方法-atimeミリ秒、秒、または分で?デフォルトは日です:

-atime n
ファイルはn * 24時間前に最後にアクセスされました。ファイルが最後にアクセスされた24時間前の期間が判明した場合、小数部分は無視されるため、-atime +1と一致するには、ファイルは少なくとも2日前にアクセスされている必要があります。

Cronジョブを1時間ごとに実行して、特定のディレクトリ内のファイルがその時間内にアクセスされたかどうかを確認したいと思います。小数として時間を入力しても機能しないようです。

find . -atime 0.042 -print

しかし、とにかくもっと良い解決策があるかもしれません–おそらく別のコマンド?または、おそらくこれは実行できません..最後に変更されたファイルを見つけるためにx分あります-mminこれにより、時間を分単位で設定できます。おそらく、アクセス時間にそのようなオプションがないことは、情報が同じ方法で保存されていないことを意味しますか?

私はUbuntu 16.04を使用しています。

5
Ville

_-mtime <timespec>_を実行すると、_<timespec>_はfindが開始されたときのファイルの経過時間をチェックすることに注意してください。

非常に小さなディレクトリツリーで実行しない限り、findがディレクトリツリーをクロールしてすべてのファイルに対してlstat()を実行するには、数ミリ秒(数秒または数時間ではない)かかります。したがって、1秒未満の精度であると、必ずしも意味がありません。

また、すべてのファイルシステムが1秒未満の粒度のタイムスタンプをサポートしているわけではないことにも注意してください。

そうは言っても、いくつかのオプションがあります。

多くのBSDのfindと_schily-tools_のBSDを使用すると、次のことができます。

_find . -atime -1s
_

最後にアクセスされてから1秒未満のファイルを検索する(findが開始されたときと比較して)。

zshの場合:

_ls -ld -- **/*(Dms-1)
_

GNUツールを使用すると、1秒未満の細分性のために、touchでatimeを設定した参照ファイルを使用できます。

_touch -ad '0.5 seconds ago' ../reference
find . -anewer ../reference
_

または、Perlの最新バージョン:

_Perl -MTime::HiRes=lstat,clock_gettime -MFile::Find -le '
  $start =  clock_gettime(CLOCK_REALTIME) - 0.5;
  find(
    sub {
      my @s = lstat $_;
      print $File::Find::name if @s and $s[8] > $start
    }, ".")'
_
7

GNU findを使用すると、-amin の代わりに -atime。ご想像のとおり、「ファイルはn分前に最後にアクセスされました」です。

そうは言っても、ほとんどの最近のシステムはデフォルトでファイルシステムにrelatimeオプションを使用することに注意してください。これにより、ファイルが実際にmodified最後のアクセス以降、またはしきい値(通常は24時間)が経過した場合。

したがって、おそらく、問題のファイルシステムに対して変更するか、別のアプローチを探す必要があります。 incrond は、独自のデーモンを作成せずにファイルシステムのアクティビティで起動するスクリプトを設定するための便利な方法です。

8
mattdm