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

Mr_*_*uet 27 macos bash

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

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

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

touch my_file.py
vim my_file.py   # <- modify some content
stat my_file.py
Run Code Online (Sandbox Code Playgroud)

有关如何从命令行获取这两个日期的任何想法?

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

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

blm*_*blm 36

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

$ GetFileInfo -d .bash_profile
10/08/2015 09:26:35
Run Code Online (Sandbox Code Playgroud)

这是一个更完整的例子:

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

请注意,使用vim此测试可能会产生误导,因为vim将修改后的文件写入新的临时文件,然后重命名旧文件和新文件,因此创建时间将更新为写入文件的时间.请参阅此文章,了解我为此提出的解决方法.

  • 实际上 Mac OSX 上的 `stat` 可以显示创建/出生时间。你就是不能使用`stat -x`。普通的旧 `stat &lt;file&gt;` 将在一行中显示 4 个日期:atime、mtime、ctime、Btime。或者您可以进行更漂亮的格式化,请参阅 /sf/answers/3314012061/ (4认同)
  • 显然,自 Xcode 6 以来,`GetFileInfo` 已被弃用。至少,`man GetFileInfo` 是这么说的,[Xcode 发行说明](https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/ Chapters/Introduction.html)(在页面上搜索“GetFileInfo”)。不过,无法确定是否有任何替代品,但它仍然可以在 Sierra 中使用。 (3认同)
  • @anothernode我认为`mdls`是替代品,虽然它似乎是在咨询元数据存储,而不是文件本身,所以如果元数据存储不同步或者尚未获取文件的更改,那么它似乎是可能会给出错误的结果 (3认同)
  • 哦,这就是为什么......你是对的!vim是罪魁祸首...谢谢:) (2认同)

wis*_*cky 9

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

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

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

  • `stat -f "%SB" file.txt` 将显示文件的出生时间。你真的很酷。 (3认同)
  • `stat -f %B file.txt` 会将文件的诞生时间显示为 Unix 时间戳(纪元)。通过使用星号“文件/目录/*”,这也适用于单个目录中的所有文件和目录 (3认同)