5

Perlで現在時刻とファイル作成時刻を比較したいのですが、どちらも形式が違います。localtime の形式は次のとおりです。

22116291110813630

ファイル作成時間は

Today, December 29, 2008, 2:38:37 PM

どちらが大きいか、その違いを比較するにはどうすればよいですか?

4

4 に答える 4

16

stat()とtime()/ localtime()を使用するよりもさらに簡単です。

my $diff = -M $filename;

-M演算子は、ファイルの「経過時間」(プログラムの開始からの日数)を返します。-X関数またはで文書化されていperldoc -f -Xます。

于 2008-12-29T18:31:43.550 に答える
14

値を比較する場合はlocaltime、スカラーコンテキストで取得した数値と、取得できるiノードの変更時間を使用することをお勧めしstatます。

               ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
                  $atime,$mtime,$ctime,$blksize,$blocks)
                      = stat($filename);

どこ:

                 0ファイルシステムの開発デバイス番号
                 1inoのiノード番号
                 2モードファイルモード(タイプと権限)
                 ファイルへの(ハード)リンクの3nlink数
                 4ファイルの所有者のuid数値ユーザーID
                 ファイルの所有者の5gid数値グループID
                 6 rdevデバイス識別子(特殊ファイルのみ)
                 7サイズファイルの合計サイズ(バイト単位)
                 エポック以降の8時間の最終アクセス時間(秒単位)
                 エポックからの9mtimeの最終変更時間(秒単位)
                エポックからの10ctimeiノード変更時間(秒単位)(*)
                11ファイルシステムI/Oのblksize優先ブロックサイズ
                12ブロック実際に割り当てられたブロック数

したがって、フィールド9が必要です。


$mtime = ( stat $filename )[9];
$current_time = time;

$diff = $current_time - $mtime;

于 2008-12-29T11:21:58.970 に答える
3

localtimeリスト コンテキストの値のリストを返します。localtime のドキュメントまたはperlheatを参照してください。あなたの例では、それらがすべて一緒につぶれたように見えます。スカラー コンテキストでは、 のような書式設定された文字列を返しますMon Dec 29 03:16:33 2008。ほとんどのプラットフォームでは、ファイル i ノードの変更時間はstat、あるエポックからの秒数として返されます。time()それを( not )の結果と直接比較できるはずですlocaltime()

于 2008-12-29T11:17:43.177 に答える
0

これらの 2 つの関数は、jimtut の回答のおかげです。fileage は、ファイルが作成されたときから、シェルでの使用に最適な秒数を整数として出力します。fileage は上記の質問に対する答えですが、dataage はファイルの内容について同じものを出力しますが、それは私が探していた答えです。これらは両方とも役立つと確信しています。

function fileage {
  perl -e 'printf "%i\n", 60 * 60 * 24 * -C "'"${1:?Must provide a file name}"'"'
}

function dataage {
  perl -e 'printf "%i\n", 60 * 60 * 24 * -M "'"${1:?Must provide a file name}"'"'
}
于 2013-02-25T16:37:01.270 に答える