与えられたファイルの年齢を取得する

与えられたファイルの年齢を取得する

与えられたファイルの寿命を取得する方法(最小日数)は何ですか?

ls -lh同様のコマンドに精通しています。私が望むものは次のように動作します。

getfage <FILE> # prints out '12d' (12 days)

また、Mac OS Xでも使用したいので、ある程度クロスプラットフォームが必要ですが、主なユースケースはLinuxボックスにあります。

ノート

Linuxは生成時間を追跡しないので、2つの解決策を探しています。一つは時間(Linux) - つまりファイルが最後に変更された時刻--Mac OS X用にも対応できます。時間または作成時間。

答え1

OSXはファイルの生成を追跡しますが、他のほとんどのUnixはそうではないので、ファイルが作成されてからどれくらいの時間が経過したのかわかりません。ほとんどすべてのオペレーティングシステムで最後の修正以降の経過時間を取得できます。

ls出力を解析することはほとんど不可能であることを除いて、ファイル変更時間を取得するポータブルシェルユーティリティはありません。 Linuxでは、次のコマンドはファイルの寿命を印刷します。

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

Linuxstat -c %Y -- "$filename"ではdate +%s -r "$filename"

OSXdatestatコマンドは異なります。次のコマンドを使用できます。

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds
echo $((($(date +%s) - $(stat -t %s -f %m -- "$filename")) / 86400)) days

非組み込みLinuxシステムとOSXには、デフォルトでPerlがインストールされています。

perl -l -e 'print -M $ARGV[0], " days"' "$filename"
perl -l -e 'print 86400 * -M $ARGV[0], " seconds"' "$filename"
perl -l -e '$mtime = (stat($ARGV[0]))[9]; print time - $mtime, " seconds"' -- "$filename"

答え2

Unixは作成日を記録しません。利用可能な唯一の情報は通常、ファイルの最後の時間です。

  1. 訪問しました
  2. 修正済み
  3. 変更
  • access - ファイルが最後に読み込まれた時刻
  • 修正 - ファイルが最後に変更された時間(コンテンツが修正された)
  • 変更済み - ファイルのメタデータが最後に変更された日付(権限など)

この回答では)

このコマンドを使用して、特定のファイルに関連する日付を取得できますstat

はい

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSXとHFS

OSXを使用している場合、そのUnixで使用されるファイルシステムは次のとおりです。高周波FS。これは、他のUnixと同様に、ファイルシステムで作成日や変更時間などを維持する数少ない(私が知っている)ことの1つです。

抜粋

ファイルレコードには、CNID、ファイルサイズ、3つのタイムスタンプ(ファイル作成時刻、最後の変更時刻、最後のバックアップ時刻)、データの最初のファイル範囲、リソースフォーク、拡張子へのポインタなど、ファイルへのさまざまなメタデータが含まれます。保存します。およびエクステントオーバーフローファイル内のファイルのリソースエクステントレコード。ファイルレコードには、Finderがファイル作成者コード、タイプコード、ファイルを表示するウィンドウ、ウィンドウ内の場所など、ファイルのプロパティを保存するために使用する2つの16バイトフィールドも格納されます。

タイムスタンプ

タイムスタンプは常にファイルシステムに保存されるため、タイムスタンプを介して提供される時間追跡(EXT3、EXT4、XFSなど)によって制限されます。

ファイルシステム

ご質問がある場合は、次のウィキペディアのトピックを確認してください。ファイルシステムの比較。これには、私が知っている最も広範なファイルシステムのリストがあるだけでなく、さまざまな機能とそのファイルシステムでサポートされているかどうかについての状態をリストした素晴らしいテーブルがあります。

引用する

答え3

Gillesの答えに基づいて、以下はファイルの寿命を秒単位またはエラー単位で返すbash関数です。

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}

答え4

ただ出力したい場合12日または12日私はこれを使用しています...

filename=/path/to/your/file.txt
now=$(date +%s)
modified=$(date -r "$filename" "+%s")
delta=$((now-modified))
printf 'Created %d days ago\n' $((delta/86400))
printf 'Created %dh:%dm:%ds ago\n' $((delta/3600)) $((delta%3600/60)) $((delta%60))

関連情報