萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux Shell 遞迴列出目錄及所有子目錄檔案的兩種腳本寫法 (find + 迴圈 / 函數遞迴)

Shell 腳本可輕鬆實現遞迴遍歷目錄樹並列出所有檔案。本文提供兩種寫法:find 管線配合 for 迴圈、自訂遞迴函數,適合不同場景。

方法一: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"  # 依名稱過濾

copyright © 萬盛學電腦網 all rights reserved