与えられたファイルの寿命を取得する方法(最小日数)は何ですか?
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"
。
OSXdate
とstat
コマンドは異なります。次のコマンドを使用できます。
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は作成日を記録しません。利用可能な唯一の情報は通常、ファイルの最後の時間です。
- 訪問しました
- 修正済み
- 変更
- 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))