stat 指令:取得檔案完整元資料
在 Linux 世界中,我們經常需要檢查檔案的詳細資訊。對於大多數使用者而言,ls -l 指令是獲取檔案權限、擁有者、大小和修改時間的標準方式。然而,當我們需要更底層、更精確的檔案系統元資料(Metadata)時,ls 提供的資訊往往顯得不足。這時候,stat 指令便成為了系統管理員和開發者不可或缺的工具。
stat 指令的核心價值在於它能直接從檔案系統層級讀取檔案的 inode 資訊,而非依賴檔案內容。這意味著即使檔案內容被修改,只要檔案屬性未變,stat 回報的元資料依然準確。本文将深入解析 stat 的用法、常見選項以及實際應用場景。
基礎用法與輸出解析
在 Ubuntu 22.04 或 Debian 12 系統中,stat 通常預設安裝。最基本的用法是直接指定檔案路徑:
stat ~/example.txt
執行後,你會看到類似以下的輸出:
File: /home/user/example.txt
Size: 4096 Blocks: 8 IO Block: 4096 regular file
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2023-10-27 10:00:00.000000000 +0800
Modify: 2023-10-27 10:05:00.000000000 +0800
Change: 2023-10-27 10:05:00.000000000 +0800
Birth: -
這段輸出包含了三個關鍵區塊:
- 檔案基本資訊:包含檔案名稱、大小(Size)、佔用的磁碟區塊數(Blocks)以及檔案類型(regular file, directory, symbolic link 等)。
- 權限與擁有者:Access 行顯示了八進位的權限模式(如 0644)以及符號化權限(-rw-r--r--),同時列出 UID 和 GID。
- 時間戳記:這裡有三個時間點,分別代表:
- Access:最後一次讀取檔案內容的時間。
- Modify:檔案內容最後一次被修改的時間。
- Change:檔案元資料(如權限、擁有者)最後一次被改變的時間。注意,修改權限也會觸發 Change 時間更新,但不會影響 Modify 時間。
客製化輸出格式
stat 最強大的功能在於其格式化選項 -c(或 --format)。透過佔位符(Placeholder),你可以精確控制輸出的內容,這對於腳本自動化處理尤為重要。
取得純文字日期
若你只需要檔案最後修改的時間,且希望格式符合人類閱讀習慣,可以使用 %y:
stat -c %y ~/example.txt
輸出結果可能為:2023-10-27 10:05:00.000000000 +0800
取得 Unix 時間戳記
在編程或日誌分析中,Unix 時間戳記(自 1970 年 1 月 1 日以來的秒數)非常實用。使用 %Y 選項:
stat -c %Y ~/example.txt
輸出結果將是一個整數,例如:1698374700。這可以直接用於 find 指令的 -newermt 參數進行時間比較。
取得檔案大小(字節數)
有時我們需要知道檔案的確切大小,而不包含單位說明。使用 %s:
stat -c %s ~/example.txt
輸出結果為純數字,例如:4096。這在 shell 腳本中進行條件判斷時非常方便。
常見問題與注意事項
1. stat 與 ls 的時間差異為何?
許多使用者發現 stat 顯示的 Access 時間與 ls 顯示的時間不同。這是因為 ls 預設顯示的是 Modify 時間(內容最後修改時間),而 stat 預設顯示 Access 時間(最後讀取時間)。若檔案內容未變但被讀取過,Access 時間會更新,但 ls 看起來卻沒變。若需一致,請使用 stat -c %y 或 ls -l --time=access。
2. 符號連結(Symbolic Link)的處理
預況下,stat 會跟隨符號連結,顯示目標檔案的資訊。若你想查看連結本身(而非目標)的元資料,需加上 -L 選項:
stat -L -c %n %s mylink.txt
這裡 %n 表示檔案名稱,%s 表示大小。加上 -L 後,若 mylink.txt 是一個連結,stat 將報告連結檔案本身的資訊(通常大小為 0 或連結路徑長度),而非目標檔案。
3. 效能考量
由於 stat 直接存取檔案系統結構,對於大量檔案的操作,建議搭配 find 使用,而非迴圈呼叫 stat。例如,找出所有今天修改的檔案並顯示其大小:
find /home/user -type f -newermt "today" -exec stat -c "%n %s" {} \;
小結
stat 指令雖不常出現在日常命令列操作中,但在系統除錯、腳本編寫和檔案系統分析中扮演著關鍵角色。它提供了比 ls 更精確、更底層的檔案元資料視角。掌握其格式化選項(如 %Y、%s、%y)與符號連結處理(-L),能大幅提升你在 Linux 環境下的工作效率。建議在需要自動化處理檔案屬性時,優先考慮使用 stat 而非解析 ls 的輸出,以確保穩定性與準確性。