Perlで現在時刻とファイル作成時刻を比較したいのですが、どちらも形式が違います。localtime の形式は次のとおりです。
22116291110813630
ファイル作成時間は
Today, December 29, 2008, 2:38:37 PM
どちらが大きいか、その違いを比較するにはどうすればよいですか?
stat()とtime()/ localtime()を使用するよりもさらに簡単です。
my $diff = -M $filename;
-M演算子は、ファイルの「経過時間」(プログラムの開始からの日数)を返します。-X関数またはで文書化されていperldoc -f -X
ます。
値を比較する場合は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;
localtime
リスト コンテキストの値のリストを返します。localtime のドキュメントまたはperlheatを参照してください。あなたの例では、それらがすべて一緒につぶれたように見えます。スカラー コンテキストでは、 のような書式設定された文字列を返しますMon Dec 29 03:16:33 2008
。ほとんどのプラットフォームでは、ファイル i ノードの変更時間はstat
、あるエポックからの秒数として返されます。time()
それを( not )の結果と直接比較できるはずですlocaltime()
。
これらの 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}"'"'
}