获取给定文件的年龄


12

如何至少在几天之内获得给定文件的期限?

我非常了解ls -lh和类似的命令。我想要可以像这样工作的东西:

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

另外,这还需要跨平台,因为我也想在Mac OS X下使用它,但是主要的用例是在Linux机器上。

注意

由于Linux不会跟踪创建时间,因此我正在寻找两种解决方案:一种用于mtime(linux),这是上次修改该文件的时间,另一种用于Mac OS X,可以处理mtime或创建时间。



@slm这是专门关于创建时间的,它不涉及在命令行中计算年龄。
吉尔(Gilles)'所以


@terdon,不是真的。请参阅上面的“ 我的注释”
Alexej Magura

@AlexejMagura,骗子中的答案对您有何影响?stat给您您所需要的一切吗?
terdon

Answers:


17

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类似)的少数(我知道)之一。

摘抄

文件记录存储有关文件的各种元数据,包括其CNID,文件大小,三个时间戳(创建文件,最后修改,最后备份时),数据的第一个文件范围以及资源派生和指针扩展到溢出文件中文件的第一个数据和资源范围记录。文件记录还存储两个16个字节的字段,Finder可以使用它们存储有关文件的属性,包括文件的创建者代码,类型代码,文件应出现的窗口以及其在窗口中的位置。

时间戳记

时间戳始终保存在文件系统中,因此,无论时间戳是通过它们提供的(EXT3,EXT4,XFS等),您都会受到限制。

文件系统

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

参考文献


感谢您的更新,对您有所帮助。实际上,我在这里读到ext4可以保留创建日期,但是尚未在内核中实现。
terdon

@terdon-是的,某些文件系统会支持它是有意义的。对我来说似乎应该早就该了,我过去了解为什么会遗漏它,但是自从一开始以来一切都已经取得了很大进步,以至于明确地没有它是没有道理的。另外,您可以禁用对访问时间的支持,以便可以类似地实现它,然后在您确实不想要时将其禁用。
slm

18

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

没有可移植的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"

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

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

非嵌入式Linux系统和OSX默认情况下已安装Perl。

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

这取决于操作系统还是文件系统?问答似乎暗示文件系统保留了它们,但是内核需要提供一种访问它们的方法。
terdon

@terdon-查看我的更新。
slm

@terdon两者。您所链接的“问题与答案”是正确的,当前文件系统已经跟踪了一段时间。在FreeBSD中,您实际上可以从statLinux上获得此信息,而在Linux中,尚未对syscall进行重新处理,因此您必须诉诸于debugfs
wingedsubmariner

1
需要注意的是,文件系统中的创建时间通常不是应用程序中的创建日期,因为许多应用程序都使用create-new-then-move作为保存新版本的方法,而不是就地覆盖。
吉尔斯(Gilles)“所以,别再邪恶了”

4

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

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

1
整洁的功能,易于添加简单的除法,以适应小时,天,周的年龄..
Emmanuel Devaux

0

您可以使用stat -f%Bls -lUmdls -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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.