Shell 腳本可輕鬆實現遞迴遍歷目錄樹並列出所有檔案。本文提供兩種寫法:find 管線配合 for 迴圈、自訂遞迴函數,適合不同場景。
#!/bin/bash
echo "please input the directory:"
read cdir
for dir in $(find "$cdir" -type d); do
echo "change to $dir"
cd "$dir"
ls
echo "----------"
done
cd "$cdir"
find "$cdir" -type d 列出所有子目錄 (含本身)。ls。#!/bin/sh
read -p "Input Path: " SPATH
FILELIST() {
filelist=$(ls "$SPATH")
for filename in $filelist; do
if [ -f "$filename" ]; then
echo "File: $filename"
elif [ -d "$filename" ]; then
cd "$filename"
SPATH=$(pwd)
echo "$SPATH"
FILELIST
cd ..
else
echo "$SPATH/$filename is not a common file."
fi
done
}
cd "$SPATH"
FILELIST
echo "Done."
FILELIST 遞迴呼叫自身處理子目錄。SPATH 需全域或傳參,範例中直接修改全域變數。| 特性 | find + for | 遞迴函數 |
|---|---|---|
| 程式碼長度 | 短 | 長 |
| 效能 | 高 (單一 find) | 較低 (重複 ls/stat) |
| 可控性 | 易加入過濾條件 | 易在每層加入自訂邏輯 |
| 適用場景 | 批次處理、收集檔案清單 | 教學、需逐層互動處理 |
find /path -type f # 所有一般檔案
find /path -type f -name "*.log" # 依名稱過濾
