指定されたファイルの年齢を取得


12

特定のファイルの経過日数を少なくとも何日で取得できますか?

私はよくls -lh似たコマンドを知っています。私は次のように機能するものが欲しい:

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

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

注意

Linuxは作成時間を追跡しないので、2つの解決策を探しています。1つはmtime(linux)でもう1つはファイルが変更されたということです。もう1つはMac OS Xです。mtimeまたは作成時間。



@slm具体的には作成時間に関するもので、コマンドラインで年齢を計算することはありません。
ジル 'SO-悪であるのをやめる'


@terdon、そうでもない。上記のメモを参照してください。
アレクセイマグラ

@AlexejMaguraそして、だまされた人の答えはあなたのためにどうしませんか?stat必要なものはすべて揃っていますか?
テルドン

回答:


16

Unixは作成日を追跡しません。利用可能な情報は、通常、ファイルが最後にあった時間のみです:

  1. アクセス済み
  2. 修正済み
  3. かわった
  • アクセス-ファイルが最後に読み取られた時間
  • 変更-ファイルが最後に変更された(コンテンツが変更された)
  • 変更-ファイルのメタデータが最後に変更された時刻(許可など)

この回答から

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で使用されているファイルシステムはHFSです。これは、他のUnixと同様に、変更時刻などとともに、作成日をファイルシステム内に保持する数少ない(私が知っている)ものの1つです。

抜粋

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

タイムスタンプ

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

ファイルシステム

興味があれば、Wikipediaのトピック「ファイルシステムの比較」をご覧ください。私が知っているファイルシステムの最も広範なリストと、さまざまな機能の素敵な表と、特定のファイルシステム内でサポートされているかどうかのステータスがあります。

参照資料


更新してくれてありがとう。実は、私が読んでここに ext4のは、作成日を保つことができるということが、これはまだカーネルに実装されていません。
テルドン

@terdon-いくつかのファイルシステムがそれをサポートするのは理にかなっています。私にとっては長い間遅れていたようです。過去にそれが除外された理由を理解していますが、最初からすべてが非常に進んでおり、明示的にこれを持たないことは意味がありません。また、アクセス時間のサポートを無効にすることもできます。これにより、同様に実装でき、本当に必要ない場合は無効にできます。
slm

18

OSXはファイル作成を追跡しますが、他のほとんどの大学は追跡しないため、ファイル作成からの経過時間を知る方法はありません。ほぼすべてのオペレーティングシステムで、最後の変更からの経過時間を取得できます。

ファイルの変更時間を取得するための移植可能なシェルユーティリティはありませんがls、解析するのが不可能な出力がある場合を除きます。Linuxでは、次のコマンドはファイルの経過時間を出力します。

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

Linuxでは、stat -c %Y -- "$filename"の同義語として使用できますdate +%s -r "$filename"

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

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

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

perl -l -e 'print -M $ARGV[0], " days"' "$filename"

これはOSまたはファイルシステムに依存しますか?この Q&Aは、ファイルシステムがそれらを保持しているが、カーネルがそれらにアクセスする方法を提供する必要があることを暗示しているようです。
テルドン

@terdon-私の更新を参照してください。
slm

@terdon両方。リンクするQ&Aは正しいです。現在のファイルシステムは作成時間をしばらく追跡しています。FreeBSDでは、から実際にこれを取得できstatます。Linuxでは、syscallが修正されていないため、でハッキングする必要がありdebugfsます。
wingedsubmariner

1
@wingedsubmarinerファイルシステムでの作成時間は、アプリケーションでの作成日ではないことが多いことに注意してください。多くのアプリケーションは、上書きではなく新しいバージョンを保存する方法としてcreate-new-then-moveを使用します。
ジル「SO-悪であるのをやめる」

4

Gillesの答えに基づいて、ファイルの経過時間を秒またはエラーで返すbash関数を次に示します。

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

1
ニートの機能は、簡単に....時間、日、週に年齢を確認するために、単純な割り算を追加することによって適応させる
エマニュエルDevaux

0

、、またはを使用してstat -f%B、OS Xで作成(誕生)時間を確認できます。ls -lUmdls -n kMDItemFSCreationDate

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.