我正在嘗試從 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 格式不包含日期,因此您只能保留檔案的修改時間戳記。
延伸閱讀: