Command-Line

獲取給定文件的年齡

  • March 31, 2022

如何至少在幾天內獲得給定文件的年齡?

我很清楚ls -lh和類似的命令。我想要一些可以像這樣工作的東西:

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

此外,這需要有點跨平台,因為我也想在 Mac OS X 下使用它,但主要案例是在我的 Linux 機器上。

筆記

由於 Linux 不跟踪創建時間,我正在尋找兩種解決方案:一種用於mtime (linux)——即最後一次修改所述文件——另一種用於 Mac OS X,它可以處理mtime或創建時間。

Unix 不跟踪創建日期。唯一可用的資訊通常是文件的最後一次是:

  1. 已訪問
  2. 修改的
  3. 改變了
  • 訪問 - 上次讀取文件的時間
  • Modify - 上次修改文件的時間(內容已被修改)
  • Change - 上次更改文件元數據的時間(例如權限)

來自這個答案

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。

摘抄

文件記錄儲存有關文件的各種元數據,包括其 CNID、文件大小、三個時間戳(文件創建時間、上次修改時間、上次備份時間)、數據的第一個文件範圍以及資源分支和指針到範圍溢出文件中文件的第一個數據和資源範圍記錄。文件記錄還儲存兩個 16 字節欄位,Finder 使用這些欄位來儲存有關文件的屬性,包括其創建者程式碼、類型程式碼、文件應出現的視窗及其在視窗中的位置。

時間戳

時間戳始終保存在文件系統中,因此您會受到通過它們提供的任何時間跟踪(EXT3、EXT4、XFS 等)的限制。

文件系統

如果您好奇,請查看標題為:文件系統比較的Wikipedia 主題。它具有我所知道的最廣泛的文件系統列表,以及一個很好的表格,其中包含各種功能以及在給定文件系統中是否支持它的狀態。

參考

OSX 會跟踪文件的創建,但大多數其他 unice 不會,因此無法知道自文件創建以來經過的時間。您幾乎可以在任何作業系統上獲取自上次修改以來經過的時間。

沒有可移植的 shell 實用程序來檢索文件的修改時間,除非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".

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"

引用自:https://unix.stackexchange.com/questions/102691