Linux 文件系統記錄三類時間戳:atime(最後訪問)、mtime(內容最後修改)、ctime(元數據最後變更)。touch 不僅能創建空文件,更是精準控制這些時間戳的利器。本文深度解析參數矩陣、日期格式與實戰場景,助您隨心所欲掌握文件時間。
| 參數 | 長選項 | 作用對象 | 說明 |
|---|---|---|---|
-a | --time=atime | atime | 僅修改最後訪問時間 |
-m | --time=mtime | mtime | 僅修改內容修改時間(最常用) |
-c | --no-create | — | 不創建不存在的文件(配合腳本判斷文件是否存在) |
-d | --date=STRING | atime+mtime | 使用指定字符串時間,而非當前時間(支援多種自然語言格式) |
-t | --time=STAMP | atime+mtime | 使用 [[CC]YY]MMDDhhmm[.ss] 格式時間戳 |
-r | --reference=FILE | atime+mtime | 複製參考文件的時間戳到目標文件 |
-h | --no-dereference | — | 影響符號鏈接本身而非目標文件(需系統支援) |
-d 參數)touch -d "STRING" file 支援極其豐富的格式,以下為常用示例:
| 類別 | 示例字符串 | 解析結果 |
|---|---|---|
| 標準日期 | "2024-12-31 23:59:59" | 精確到秒 |
| 美式日期 | "12/31/2024" | 月/日/年,時間默認 00:00 |
| 相對時間 | "3 days ago", "yesterday", "last Monday" | 相對當前時間 |
| 僅時間 | "18:30", "6:30pm" | 今日指定時間 |
| 組合 | "6:30pm 12/31/2024" | 指定日期時間 |
| RFC 2822 | "Tue, 31 Dec 2024 23:59:59 +0800" | 郵件頭格式 |
| ISO 8601 | "2024-12-31T23:59:59+08:00" | 國際標準 |
技巧:date --date="STRING" 可預覽解析結果,確認無誤再用於 touch。
-t 參數)# 格式:[[CC]YY]MMDDhhmm[.ss]
touch -t 202412312359.59 file # 2024-12-31 23:59:59
touch -t 2412312359 file # 同義(當前世紀)
touch -t 12312359 file # 當前年份 12月31日 23:59
# 當前文件列表
$ ls -l *.sh
-rwxrwxr-x 1 user user 8143 Jan 9 14:41 3.sh
-rw-r--r-- 1 user user 0 Jan 9 14:41 4.sh
-rwxr-xr-x 1 user user 8143 Jan 9 14:44 77.sh
# 一鍵修改為 2023-10-13 00:00:00
touch -d "2023-10-13" *.sh
# 驗證結果
$ ls -l *.sh
-rwxrwxr-x 1 user user 8143 Oct 13 00:00 3.sh
-rw-r--r-- 1 user user 0 Oct 13 00:00 4.sh
-rwxr-xr-x 1 user user 8143 Oct 13 00:00 77.sh
touch -r reference.txt target.txt
# target.txt 的 atime/mtime 現與 reference.txt 完全一致
touch -a -d "1 hour ago" secret.log
# atime 變為 1 小時前,mtime 不變
# 僅當文件不存在時創建,存在則不動作
touch -c /var/run/myapp.pid
# 將源文件 mtime 設置為未來時間,make 會認為它已修改
touch -d "tomorrow" src/core/module.c
make # 該模塊將被重新編譯
| 時間戳 | 含義 | 查看命令 | 修改觸發條件 |
|---|---|---|---|
| atime | Access Time - 最後讀取/訪問 | stat -c %x file / ls -lu | read(), open() 讀取 |
| mtime | Modify Time - 內容最後修改 | stat -c %y file / ls -l | write(), truncate() 寫入 |
| ctime | Change Time - 元數據最後變更 | stat -c %z file / ls -lc | chmod, chown, mv, rename, link/unlink |
關鍵點:touch 可修改 atime/mtime,**無法直接修改 ctime**(ctime 會隨 inode 元數據變更自動更新)。若需偽造 ctime,需修改系統時間後操作,或使用 debugfs 直接操作 inode(極高風險,僅限取證實驗環境)。
現代文件系統(ext4, xfs, btrfs)支援納秒級時間戳。touch -d 字符串可包含小數秒:
touch -d "2024-12-31 23:59:59.123456789" file
stat file
# Access: 2024-12-31 23:59:59.123456789
# Modify: 2024-12-31 23:59:59.123456789

touch file (創建/更新至今)、touch -d "YYYY-MM-DD HH:MM" file (指定時間)。touch -c 避免誤創文件。-a/-m 分離 atime/mtime,-r 複製參考文件時間。stat 還原文件生命週期真相。掌握 touch 全參數矩陣,讓文件時間戳成為您手中可編程的精準工具,而非不可控的系統副產物。