$ ls -l
total 40
-rw-r--r-- 1 user user 1024 Jan 1 10:00 file1.txt
-rw-r--r-- 1 user user 2048 Jan 1 10:00 file2.txt
... (共 13 個文件)
$ ls -l | wc -l
14
明明有 13 個文件,`wc -l` 卻輸出 14。
`ls -l` 輸出的**第一行**是:
total 40
這行顯示當前目錄下所有文件佔用的磁碟塊總數 (單位通常為 1K 塊),**並非文件記錄**。`wc -l` 統計的是換行符數量,故將此行計入。
ls -l | tail -n +2 | wc -l
# 或
ls -l | sed 1d | wc -l
ls -1 | wc -l
# 輸出 13 (無 total 行)
注意: `ls -1` (數字一) 與 `ls -l` (字母 L) 截然不同。
# 僅當前目錄非隱藏文件
find . -maxdepth 1 ! -name "." ! -name ".." -printf "." | wc -c
# 含隱藏文件
find . -maxdepth 1 ! -name "." -printf "." | wc -c
# 普通文件
find . -maxdepth 1 -type f | wc -l
# 目錄
find . -maxdepth 1 -type d | wc -l
# 符號鏈接
find . -maxdepth 1 -type l | wc -l
# 遞歸統計 .c/.h 文件總行數
find . -name "*.c" -o -name "*.h" | xargs wc -l
# 排除空行與註釋行 (粗略)
find . -name "*.c" -o -name "*.h" | xargs grep -v "^$" | grep -v "^\s*//" | wc -l
| 需求 | 命令 | 說明 |
|---|---|---|
| 統計可見文件數 | `ls -1 | wc -l` | 最簡單,無 total 行 |
| 統計含隱藏文件 | `ls -1A | wc -l` | -A 顯示隱藏文件 (不含 . 和 ..) |
| 統計 ls -l 詳細列表的文件行 | `ls -l | tail -n +2 | wc -l` | 跳過 total 行 |
| 遞歸統計所有文件 | `find . -type f | wc -l` | 含子目錄 |
| 遞歸統計代碼行數 | `find . -name "*.py" | xargs wc -l` | 按副檔名過濾 |
`ls -l` 的 `total` 行是磁碟佔用摘要,非文件記錄。統計文件數請用 `ls -1 | wc -l` 或 `find` 系列命令,根據是否遞歸、是否含隱藏文件選擇適當參數,避免「多一行」的統計陷阱。