OSX - 如何从命令行获取文件的创建和修改时间

Posted

技术标签:

【中文标题】OSX - 如何从命令行获取文件的创建和修改时间【英文标题】:OSX - How to get the creation & modification time of a file from the command line 【发布时间】:2015-12-06 21:35:13 【问题描述】:

在解决一些编程难题时,我想看看我花了多长时间编写解决方案。为此,我认为最好将文件创建日期与最新修改日期进行比较。

在终端(OSX)中,我尝试了以下命令,惊讶地发现连续三次看到相同的日期:

stat my_file.py
16777220 10280844 -rw-r--r-- 1 username staff 0 7214 \
"Dec  5 08:32:39 2015"  \
"Dec  5 08:32:39 2015"  \
"Dec  5 08:32:39 2015"  \
"Dec  5 08:32:39 2015" 4096 16 0 my_file.py

我创建然后修改文件的方式:

touch my_file.py
vim my_file.py   # <- modify some content
stat my_file.py

知道如何从命令行获取这两个日期吗?

澄清:我不想计时脚本的执行时间。

编辑:问题在于 vim 在保存时更改了创建日期,接受的答案仍然为感兴趣的人提供了深入的回答。

【问题讨论】:

如果你想为命令计时,那为什么不time command 这不是问题所在。我正在尝试获取脚本的创建和最后修改日期。不测量执行时间。 ...为了“看看我花了多长时间解决问题”。 ^ 改为“我花了多长时间写出解决问题的方法”。 @Mr_Pouet 这是你想要的吗?:stat -f "%B %N" my_file.pystat -c "%y %N" my_file.py 【参考方案1】:

stat 报告标准 Unix 日期、上次访问时间、上次修改时间和 inode 更改时间(通常被误认为是创建时间)。 Mac OS X 还维护文件创建时间,并且可以使用GetFileInfo 命令访问:

$ GetFileInfo -d .bash_profile
10/08/2015 09:26:35

这里有一个更完整的例子:

$ ls -l my_file.py
ls: my_file.py: No such file or directory
$ touch my_file.py
$ stat -x my_file.py
  File: "my_file.py"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/     blm)  Gid: (   20/   staff)
Device: 1,5   Inode: 26863832    Links: 1
Access: Sun Dec  6 13:47:24 2015
Modify: Sun Dec  6 13:47:24 2015
Change: Sun Dec  6 13:47:24 2015
$ GetFileInfo my_file.py
file: "/Users/blm/my_file.py"
type: "\0\0\0\0"
creator: "\0\0\0\0"
attributes: avbstclinmedz
created: 12/06/2015 13:47:24
modified: 12/06/2015 13:47:24
$ echo hello >my_file.py
$ stat -x my_file.py
  File: "my_file.py"
  Size: 6            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/     blm)  Gid: (   20/   staff)
Device: 1,5   Inode: 26863832    Links: 1
Access: Sun Dec  6 13:47:24 2015
Modify: Sun Dec  6 13:47:35 2015
Change: Sun Dec  6 13:47:35 2015
$ GetFileInfo my_file.py
file: "/Users/blm/my_file.py"
type: "\0\0\0\0"
creator: "\0\0\0\0"
attributes: avbstclinmedz
created: 12/06/2015 13:47:24
modified: 12/06/2015 13:47:35
$ cat my_file.py
hello
$ stat -x my_file.py
  File: "my_file.py"
  Size: 6            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/     blm)  Gid: (   20/   staff)
Device: 1,5   Inode: 26863832    Links: 1
Access: Sun Dec  6 13:47:54 2015
Modify: Sun Dec  6 13:47:35 2015
Change: Sun Dec  6 13:47:35 2015
$ GetFileInfo my_file.py
file: "/Users/blm/my_file.py"
type: "\0\0\0\0"
creator: "\0\0\0\0"
attributes: avbstclinmedz
created: 12/06/2015 13:47:24
modified: 12/06/2015 13:47:35

请注意,使用vim 进行测试可能会产生误导,因为vim 会将您修改的文件写入一个新的临时文件,然后重命名旧文件和新文件,因此创建时间会更新为文件被写入。请参阅 this post 了解我想出的解决方法。

【讨论】:

哦,这就是为什么......你是对的! vim 是罪魁祸首...谢谢:) @Volomike 所以他们删除了它然后放回去?我有 Snow Leopard (10.6) 和 Yosemite (10.10) 机器,它们都可以使用(您可能必须安装 Xcode 才能使用它,我不记得了,也没有任何系统我没有安装了Xcode :-))。 显然 GetFileInfo 自 Xcode 6 以来已弃用。至少,man GetFileInfo 和 Xcode release notes 也是如此(在页面上搜索“GetFileInfo”)。不过,无法确定是否有任何替代品,它仍然可以在 Sierra 中使用。 @anothernode 我认为mdls 是替代品,虽然它似乎是在咨询元数据存储,而不是文件本身,所以如果元数据存储不同步或没有接收到更改文件,似乎它可能会给出不正确的结果。 其实Mac OSX上的stat可以显示Creation/Birth时间。你不能使用stat -x。普通的旧 stat &lt;file&gt; 将在一行中显示 4 个日期:atime、mtime、ctime、Btime。或者你可以做更漂亮的格式化,见***.com/a/47343029【参考方案2】:

正如您已经确定的那样,真正的罪魁祸首是 vim 重置了所有 4 个日期时间戳

但要回答您最初的问题,这里是 Mac OSX 的 stat 格式,它将清楚地显示 4 个日期时间戳(包括创建/出生和修改):

# Access (atime)
stat -f "%Sa" file.txt
# Modify (mtime)
stat -f "%Sm" file.txt
# Change (ctime)
stat -f "%Sc" file.txt
# Birth  (Btime)
stat -f "%SB" file.txt

一个命令:

stat -f "Access (atime): %Sa%nModify (mtime): %Sm%nChange (ctime): %Sc%nBirth  (Btime): %SB" file.txt
    
Access (atime): Nov 16 19:44:55 2017
Modify (mtime): Nov 16 19:44:25 2017
Change (ctime): Nov 16 19:44:48 2017
Birth  (Btime): Nov 16 19:44:05 2017

【讨论】:

stat -f "%SB" file.txt 将显示文件的出生时间。你真的很酷。 所以我认为将alias btime='stat -f "%SB"' 插入~/.bash_profile 会大大简化您的答案。 stat -f %B file.txt 将文件的诞生时间显示为 Unix 时间戳(纪元)。这也适用于单个目录中的所有文件和目录,使用星号file/directory/*

以上是关于OSX - 如何从命令行获取文件的创建和修改时间的主要内容,如果未能解决你的问题,请参考以下文章

如何从 OSX 的命令行启动 GUI Emacs?

如何从 OSX 的命令行打开 Visual Studio Code?

从 OSX 命令行访问(forge 环境)的问题

如何在 osx 机器中将 Apple 配置文件从一个用户转移到另一个用户?

如何在OSX Yosemite中从命令行触发通知?

如何从电影创建动画 .gif?