Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Shell 遞迴遍歷目錄並列出所有檔案的兩種寫法

編輯:關於 Linux

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

Shell 遍歷目錄示意

寫法一: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."
  • 展示 Shell 函式遞迴呼叫、區域變數管理(此處為簡化用全域 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% 遍歷需求;自訂遞迴函式留作教學或極特殊邏輯(如需在遍歷中動態修改檔案、依條件中斷)時使用。

Copyright © Windows教程網 All Rights Reserved