9

数千回ls --full-time呼び出すオーバーヘッドを回避するために、Perl スクリプトからの出力を再現したいと考えています。statls関数を使用して、そこからすべての情報を取得したいと考えていました。ただし、 ls 出力のタイムスタンプは高解像度クロックを使用するため、ナノ秒数も含まれます (GNU docs によると、これは --full-time が と同等であり、full-iso 時間スタイルにナノ秒)。--format=long --time-style=full-iso

Time::HiResモジュールに出くわしました。これは、標準の stat 関数を atime/mtime/ctime を浮動小数点数として返す関数でオーバーライドしますが、lstatのオーバーライドはありません。シンボリックリンクで stat を呼び出すと、リンク自体ではなく、リンクされたファイルの情報が返されるため、これは問題です。

私の質問はこれです - Time::HiRes::stat と同じ方法で atime/mtime/ctime を返す lstat のバージョンはどこにありますか? それに失敗した場合、シンボリックリンクの modtime を高解像度で取得する別の方法があります (ls を呼び出す以外に)。

4

4 に答える 4

3

Inline :: Cを使用する場合、これは最近のLinuxで機能します。

#!/usr/bin/perl

use strict;
use warnings;

use Inline C => <<'EOC';

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

long mtime_nsec(char* fname)
{
    struct stat st;
    if (-1 == lstat(fname, &st))
        return -1;
    return (long)st.st_mtim.tv_nsec;
}
EOC

print mtime_nsec($ARGV[0]);
于 2010-03-18T23:21:12.770 に答える
2

記録のために、lstat2013 年 8 月に Time-HiRes バージョン 1.9726 に追加されました。

詳細については、 https://rt.cpan.org/Public/Bug/Display.html?id=83356を参照してください。

ただし、2014-01-31 (5.18.2)1.9725の最新の安定版にはまだ含まれています。perlただし、5.19.3 の開発バージョンでは 1.9726 に上げられました。

( perl5.19.8 の時点で) が使用されているかどうかに関係Time::HiResなくlstatperl-M/ -A/-Cは依然として 1 秒未満の粒度を実行しないことに注意してください (同じ秒の時間を持つファイルは同じ経過時間を持つものとして表示されます)。そのため、sort {-M $a <=> -M $b} @filesファイルを変更時間でソートするなどのことはまだできません。

于 2014-01-31T12:31:00.373 に答える
2

あなたの最善の策は、 Time::HiReslstatへの追加を依頼することです。実際、あなたはおそらく自分でそれを行うことができます。あなたがする必要があるのは、開始する関数をコピーすることだけだと思います

void
stat(...)

inHiRes.xsに変更stat(...)し、lstat(...)&OP_STATに変更し、 inOP_LSTATに追加lstatして、再コンパイルします。次に、パッチを送信して、他の人が恩恵を受けられるようにします。@EXPORT_OKHiRes.pm

于 2010-03-18T21:22:21.680 に答える
1

次の変更が機能します。これには基本的に、HiRes.pm モジュールと xs ファイルの両方に対する変更が含まれています。

HiRes.pmで

sub lstat { 
     my @lstatvalues = CORE::lstat(shift);   
     my @nanosecvalues =  Time::HiRes::lstatimplementation( $lstatvalues[8], $lstatvalues[9], $lstatvalues[10]);   
     ( $lstatvalues[8], $lstatvalues[9], $lstatvalues[10] ) = ( $nanosecvalues[0], $nanosecvalues[1], $nanosecvalues[2]);   
     return @lstatvalues;
}

また、lstat を @EXPORT_OK リストに追加しました。

HiRes.xs で

void 
lstatimplementation(...)
PPCODE:
  UV atime = SvUV( ST( 0 ) );
  UV mtime = SvUV( ST( 1 ) );
  UV ctime = SvUV( ST( 2 ) );
  UV atime_nsec;
  UV mtime_nsec;
  UV ctime_nsec;
  hrstatns(atime, mtime, ctime,
       &atime_nsec, &mtime_nsec, &ctime_nsec);
  if (atime_nsec)
    XPUSHs( sv_2mortal(newSVnv(atime + 1e-9 * (NV) atime_nsec)));
  if (mtime_nsec)
    XPUSHs( sv_2mortal(newSVnv(mtime + 1e-9 * (NV) mtime_nsec)));
  if (ctime_nsec)
    XPUSHs( sv_2mortal(newSVnv(ctime + 1e-9 * (NV) ctime_nsec)));
于 2012-01-11T11:49:55.283 に答える