我正在尝试从 linux 命令中提取编译日期(或者 cpp 也可以)。我在用:
stat -c %z ./myProgram.bin
但是,如果我myProgram.bin
通过 ssh 复制到另一个地方,stat 命令基本上会给出复制的日期。
如何获得真实的编译日期?谢谢。
答案1
托马斯·迪基的回答对于任何 (ELF) 二进制文件,总体上解决了这个问题。鉴于您的问题的措辞方式,您可能会发现__DATE__
和__TIME__
预定义的宏有用;它们允许在程序中引用编译日期和时间(因此程序知道自己的编译日期和时间)。
这是一个简单的例子:
#include <stdio.h>
int main(int argc, char **argv) {
printf("This program was compiled on %s at %s.\n", __DATE__, __TIME__);
return 0;
}
答案2
stat -c %z
显示文件的上次创建/更新时间,并且不可更改或保存。因此,如果您将文件复制到其他位置,它将始终获得新的当前创建时间。您要寻找的是stat -c %y
显示上次修改时间,大多数处理文件和目录的工具通常都会保留该时间。
答案3
您可以复制保留修改时间,例如,
cp --preserve=timestamps source destination
或(更一般地说:模式,所有权和时间戳)
cp -p source destination
尽管在某些情况下,保留所有权不受欢迎。
同样,您可以使用 scp 的选项复制到远程系统-p
:
scp -p source remote:destination
但scp
没有模式等的单独选项。因为它以给定的方式运行偏僻的权限,它没有同时设置远程所有权的功能。由于这些限制,您可能希望tar
在远程系统上提取存档,以保留尽可能多的信息。
用于二进制文件的 ELF 格式不包含日期,因此您只能保留文件的修改时间戳。
进一步阅读: