获取给定文件的年龄

Ale*_*ura 18 command-line timestamps files

如何至少在几天内获得给定文件的年龄?

我很清楚ls -lh和类似的命令。我想要一些像这样工作的东西:

getfage <FILE> # prints out '12d' (12 days)
Run Code Online (Sandbox Code Playgroud)

此外,这需要有点跨平台,因为我也想在 Mac OS X 下使用它,但主要用例是在我的 Linux 盒上。

笔记

由于 Linux 不跟踪创建时间,我正在寻找两种解决方案:一种用于mtime (linux)——这是最后一次修改所述文件——另一种用于 Mac OS X,它可以处理mtime或创建时间。

Gil*_*il' 30

OSX 会跟踪文件创建,但大多数其他 unice 不会,因此无法知道自文件创建以来经过的时间。您可以在几乎任何操作系统上获取自上次修改以来经过的时间。

没有可移植的 shell 实用程序来检索文件的修改时间,除非ls它具有几乎不可能解析的输出。在 Linux 下,以下命令打印文件的年龄:

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days
Run Code Online (Sandbox Code Playgroud)

在Linux下,你可以使用stat -c %Y -- "$filename"作为的代名词date +%s -r "$filename"

OSXdatestat命令是不同的。您可以使用以下命令:

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds
Run Code Online (Sandbox Code Playgroud)

非嵌入式 Linux 系统和 OSX 默认安装了 Perl。

perl -l -e 'print -M $ARGV[0], " days"' "$filename"
Run Code Online (Sandbox Code Playgroud)


slm*_*slm 21

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
Run Code Online (Sandbox Code Playgroud)

OSX 和 HFS

如果您使用的是 OSX,那么在该 Unix 下使用的文件系统是HFS。这是少数(我知道的)将创建日期以及修改时间等保留在文件系统中的其中之一,类似于其他 Unix。

摘抄

文件记录存储有关文件的各种元数据,包括其 CNID、文件大小、三个时间戳(文件创建时间、最后修改时间、最后备份时间)、数据的第一个文件范围以及资源分叉和指针到范围溢出文件中文件的第一个数据和资源范围记录。File Record 还存储两个 16 字节的字段,Finder 使用这些字段来存储有关文件的属性,包括诸如创建者代码、类型代码、文件应该出现的窗口以及它在窗口中的位置等内容。

时间戳

时间戳始终保留在文件系统中,因此您受到通过它们提供的任何时间跟踪(EXT3、EXT4、XFS 等)的限制。

文件系统

如果您好奇,请查看标题为:文件系统比较 的Wikipedia 主题。它拥有我所知道的最广泛的文件系统列表,以及一个包含各种功能的漂亮表格以及在给定文件系统中是否支持它的状态。

参考


小智 7

根据 Gilles 的回答,这是一个 bash 函数,它以秒或错误为单位返回文件年龄。

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

  • 简洁的功能,通过添加简单的除法来查看年龄(小时,天,周......),易于适应。 (2认同)