? ? touch
是Linux和Unix系統中一個非常基礎但實用的命令,主要用于操作文件的時間戳和創建空文件。下面我將詳細介紹這個命令的用法和功能。
目錄
一、基本功能
1. 創建空文件
2. 同時創建多個文件
3. 創建帶有空格的文件名(需要使用引號)
二、時間戳操作
1. 修改文件的時間戳
2. 只更新訪問時間(-a選項)
關鍵結論
3. 只更新修改時間(-m選項)
4. 指定特定的時間戳
-t?選項的作用
手動設置時間戳
示例:
影響的時間戳
與?-a?或?-m?結合使用
常見用途
5. 使用參考文件的時間戳(-r選項)
三、高級用法
1. 創建大量文件
2. 防止文件被創建(-c選項)
3. 設置精確的時間(包括納秒)
4. 處理符號鏈接
場景說明
操作步驟
關鍵點
典型用途
總結
四、實際應用示例
快速創建測試文件:
批量更新項目文件時間戳:
同步兩個文件的時間戳:
創建帶有特定時間戳的日志文件:
注意事項
一、基本功能
語法:touch [選項] 文件
功能:touch命令用于修改文件或目錄的時間戳(包括訪問時間和修改時間),也可用于創建新文件(當指定文件不存在時)。
1. 創建空文件
touch
命令最常見的用途是創建一個新的空文件:
touch filename.txt
- 如果
filename.txt
不存在,上述命令會創建一個名為filename.txt
的空文件; - 如果文件已存在,則會更新該文件的時間戳(使用stat指令查看文件時間)。
2. 同時創建多個文件
touch file1.txt file2.txt file3.txt
3. 創建帶有空格的文件名(需要使用引號)
touch "new file.txt"
二、時間戳操作
touch
命令可以修改文件的三種時間戳(分別對應下圖):
-
訪問時間(atime):文件最后被讀取的時間
-
修改時間(mtime):文件內容最后被修改的時間
-
更改時間(ctime):文件屬性或內容最后被更改的時間
1. 修改文件的時間戳
touch filename.txt
-
如果文件已存在,
touch
?會將上述三個時間戳更新為當前系統時間。 -
如果文件不存在,
touch
?會創建一個空文件,并設置所有時間戳為當前時間。
2. 只更新訪問時間(-a選項)
touch -a filename.txt
但事實真的只更改訪問時間嗎?請看驗證后的效果,如下:
????????我們發現,我們原本只想改變訪問時間atime,但是更改時間ctime也被改變了?為什么會出現這樣的情況呢?思考一下:
????????ctime(Change Time)?并非指文件內容的修改時間,而是指文件元數據(metadata)的變更時間。以下操作會更新 ctime:
-
修改文件內容(影響?
mtime
,同時觸發?ctime
?更新)。 -
修改文件元數據(如權限、所有者、硬鏈接數等)。
-
更新訪問時間?
atime
(因為?atime
?本身是元數據的一部分)。
當你運行?touch -a
?時:
-
系統需要更新文件的?
atime
,而?atime
?是存儲在文件元數據中的。 -
修改元數據會導致?
ctime
?被內核自動更新(這是不可阻止的行為)。
關鍵結論
-
ctime
?不受?touch
?命令的直接控制,它由內核維護,任何對文件內容或元數據的修改都會更新它。 -
即使你只更新?
atime
(元數據的一部分),也會觸發?ctime
?的更新。 -
所以我們同理可得,下面的只更新修改時間也是會更改ctime的,理解了上面的原理之后,我們就理解了為什么ctime會跟著修改了。
3. 只更新修改時間(-m選項)
touch -m filename.txt
果然不出所料,ctime也跟著修改了,驗證了上面所說的結論:?
4. 指定特定的時間戳
? ? -t
?是?touch
?命令的一個選項,用于?手動指定文件的時間戳(而非使用當前系統時間)。它的作用是精確控制文件的?訪問時間(atime)?和?修改時間(mtime),通常用于測試、歸檔或修復文件時間。
-t
?選項的作用
-
手動設置時間戳
-
默認情況下,
touch
?使用當前時間,但?-t
?允許自定義時間。 -
格式:
[[CC]YY]MMDDhhmm[.ss]
-
CC
:世紀(可選,如?20
?表示 2000 年) -
YY
:年份后兩位(如?23
?表示 2023) -
MM
:月份(01-12) -
DD
:日期(01-31) -
hh
:小時(00-23) -
mm
:分鐘(00-59) -
.ss
:秒(可選,00-59)
-
示例:
touch -t 202301011200.30 filename.txt # 2023-01-01 12:00:30
touch -t 01231234 filename.txt # 當前年份的1月23日 12:34:00
-
-
影響的時間戳
-
默認情況下,
-t
?同時修改?atime
(訪問時間)和?mtime
(修改時間)。 -
ctime
(更改時間)不受?-t
?控制,它會自動更新為命令執行時間(因為時間戳屬于元數據)。
-
-
與?
-a
?或?-m
?結合使用-
如果只想修改?
atime
?或?mtime
,可以組合使用:touch -a -t 202301011200.00 filename.txt # 僅修改 atime
touch -m -t 202301011200.00 filename.txt # 僅修改 mtime
-
常見用途
-
偽造文件時間(測試腳本或程序的時間敏感性)。
-
修復備份文件的時間戳(使其符合原始時間)。
-
強制觸發構建工具(如?
make
?依賴?mtime
?判斷文件是否過期)。 -
批量調整文件時間(結合?
find
?使用)。
5. 使用參考文件的時間戳(-r選項)
touch -r mydir filename.txt
作用:這將使filename.txt的時間戳與mydir的時間戳相同。(使后者時間戳等于前者時間戳)
如下驗證,ctime就不討論了,它只能跟著系統走,不受影響:
三、高級用法
1. 創建大量文件
touch file{1..100}.txt
這將創建file1.txt到file100.txt共100個文件。(若之前存在同名文件,則不會創建該文件,只會創建新命名的文件,下面圖片前后的文件1到3號就可以很好的說明這一點)
若想刪除上面的大量文件,我們可以直接使用rm:
rm file{1..100}.txt
2. 防止文件被創建(-c選項)
如果只想更新時間戳而不想創建新文件:
touch -c filename.txt
?如果文件不存在,不會創建新文件:
3. 設置精確的時間(包括納秒)
touch -d "2023-01-01 12:00:00.123456789" file.txt
4. 處理符號鏈接
touch -h symlink
場景說明
????????默認情況下,touch
?會跟隨符號鏈接(symlink)并修改其目標文件的時間戳。如果想直接修改符號鏈接本身的時間戳(而非目標文件),需要使用?-h
?選項。
操作步驟
-
創建一個符號鏈接
假設有一個文件?original.txt
,并為其創建符號鏈接?symlink_to_original
:echo "This is the original file" > original.txt ln -s original.txt symlink_to_original
-
查看原始時間戳
分別檢查目標和符號鏈接的時間:stat original.txt stat symlink_to_original
輸出示例(注意符號鏈接的?
Access/Modify/Change
?時間): -
修改符號鏈接本身的時間戳(不跟隨目標)
使用?-h
?選項:touch -h -t 202301011200.00 symlink_to_original
-
驗證結果
再次運行?stat
:stat original.txt stat symlink_to_original
輸出示例:
關鍵點
-
-h
?的作用:
強制?touch
?操作作用于符號鏈接本身,而非其指向的目標文件。 -
時間戳類型:
符號鏈接的?atime/mtime
?可被修改,但?ctime
?仍會因元數據變更而自動更新。 -
默認行為對比:
不加?-h
?時,touch
?會修改目標文件的時間戳(可能導致意外影響)。
典型用途
-
調試符號鏈接:
檢查腳本是否正確處理符號鏈接的時間戳。 -
備份系統:
保留符號鏈接的原始時間信息,而非目標文件的時間。 -
文件同步工具:
確保工具(如?rsync
)能識別符號鏈接本身的變更。
總結
命令 | 行為 |
---|---|
touch symlink | 修改目標文件的時間戳 |
touch -h symlink | 修改符號鏈接本身的時間戳 |
stat symlink | 默認顯示目標文件時間,需用?stat -L ?查看鏈接本身 |
通過?-h
?選項,你可以精確控制符號鏈接的時間戳,避免影響其目標文件。
四、實際應用示例
-
快速創建測試文件:
touch test_{a..z}.txt
-
批量更新項目文件時間戳:
touch src/*.js
-
同步兩個文件的時間戳:
touch -r source_file target_file
-
創建帶有特定時間戳的日志文件:
touch -t 202212312359.59 year_end.log
注意事項
-
touch
命令需要你對目標目錄有寫權限才能創建或更新時間戳。 -
時間戳修改可能會影響備份系統、構建系統等依賴文件時間的工具。
-
在某些系統上,
ctime
(狀態更改時間)不能被直接修改,它會在文件屬性或內容更改時自動更新。