web-dev-qa-db-ja.com

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

少なくとも数日で特定のファイルの経過時間を取得するにはどうすればよいですか?

私はよく知っていますls -lhおよび類似のコマンド。私はこのような働きをするものが欲しい:

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

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

[〜#〜]ノート[〜#〜]

Linuxは作成時間を追跡しないため、mtime(linux)の2倍のソリューションを探しています。つまり、上記のファイルが最後に変更された時刻-Mac OS X用の1つで、mtimeまたは作成時間。

14
Alexej Magura

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のトピック「 ファイルシステムの比較 」を参照してください。私が知っているファイルシステムの最も広範なリストと、さまざまな機能のニーステーブルと、特定のファイルシステム内でサポートされているかどうかのステータスが含まれています。

参考文献

17
slm

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

解析することがほぼ不可能である出力を持つ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のdateコマンドとstatコマンドは異なります。次のコマンドを使用できます。

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

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

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

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

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

見る man stat ために -c(フォーマット)オプション

0
Guido Rizzi

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

$ 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
0
Lri