需求:輸入一個路徑,遞迴列出該目錄及所有子目錄下的每一個檔案。本文提供兩種 Shell 寫法:find 管線法(簡潔高效)與自訂函式遞迴法(教學示範遞迴邏輯)。

find 管線法(生產環境推薦)#!/bin/bash
read -p "please input the directory: " cdir
find "$cdir" -type f -print | while IFS= read -r file; do
echo "File: $file"
done
-type f 僅匹配一般檔案(排除目錄、連結、裝置)。while IFS= read -r 正確處理含空格、特殊字元的檔名。#!/bin/sh
read -p "Input Path: " SPATH
FILELIST() {
for filename in "$SPATH"/*; do
if [ -f "$filename" ]; then
echo "File: $filename"
elif [ -d "$filename" ]; then
# 遞迴進入子目錄
SPATH="$filename"
FILELIST
else
echo "$filename is not a common file."
fi
done
}
cd "$SPATH"
FILELIST
echo "Done."
SPATH,實務建議用 local)。find 差,且深度過大可能觸發「maximum recursion depth exceeded」。#!/bin/bash
read -p "Root path: " ROOT
find "$ROOT" -printf "%y %p\n" | sort | awk '
$1=="d" { print "DIR: " $2 }
$1=="f" { print "FILE: " $2 }'
find -printf 直接輸出類型與路徑,配合 awk 格式化,效能極佳。
| 坑點 | 正確做法 |
|---|---|
for f in `ls` 檔名含空格會拆分 | find ... -print0 | xargs -0 或 while IFS= read -r |
遞迴函式未 cd .. 導致路徑錯誤 | 函式內用 local 變數或 pushd/popd |
| 符號連結導致無限迴圈 | find -L 或在遞迴前 [ -L "$file" ] && continue |
實務上直接用 find "$dir" -type f 即可解決 99% 遍歷需求;自訂遞迴函式留作教學或極特殊邏輯(如需在遍歷中動態修改檔案、依條件中斷)時使用。
修復 Linux 下 gulp watch ENOSPC 錯誤:調大 inotify 監控上限
Ubuntu 修改 PATH 導致無法登入?進入 Recovery Mode 修復指南
Linux 終端機快捷鍵大全:刪除、移動、替換、歷史指令與進階技巧
Linux route 命令詳解:靜態路由配置與路由表管理實戰
Ubuntu 10.10 安裝 GNU Fortran 77 (g77) 編譯器:舊版相容性需求下的 apt 源擴展與 aptitude 解決相依
Linux SSH 連線自動斷開問題解決:ClientAliveInterval、ServerAliveInterval、TCPKeepAlive 三層保活機制完整配置