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 教學

應用場景

需將專案中所有 .pc 檔案重命名為 .ec,且包含所有子目錄。手動操作不切實際,遞迴函式可完美解決。

核心程式碼解析

主函式 modify()

modify() {
    PARAMS=2
    if [ $# -ne $PARAMS ]; then
        echo "usage: mv_to .suf1 .suf2"
        return 1
    fi
    count=0
    do_recursive "$1" "$2"
    echo "complete! $count files have been modified."
}

遞迴遍歷 do_recursive()

do_recursive() {
    doit "$1" "$2"
    for filename in $(ls); do
        if [ -d "$filename" ]; then
            cd "$filename"
            do_recursive "$1" "$2"
            cd ..
        fi
    done
}

檔案處理 doit()

doit() {
    oldname=$(ls | grep "$1$")
    for name in $oldname; do
        if [ -d "$name" ]; then
            :  # 略過目錄
        else
            prename=${name%.*}      # 移除副檔名
            newname="${prename}$2"  # 加上新副檔名
            echo -e "$PWD/$name\t\t$newname"
            mv "$name" "$newname"
            count=$((count + 1))
        fi
    done
}

關鍵技術點

  • 參數驗證:確保傳入兩個副檔名參數
  • 遞迴目錄切換:cd 進入子目錄處理完畢後 cd .. 返回
  • 參數擴展:${name%.*} 比 awk 更高效移除副檔名
  • 計數器累加:使用 $((count + 1)) 算術擴展
  • 引號保護:變數引用加雙引號防止空白字元導致錯誤

使用方式

source modify.func  # 載入函式
modify .pc .ec      # 執行重命名

進階改良建議

  1. 使用 find 替代 ls | grep 處理大量檔案更可靠
  2. 加入 -i 互動模式防止誤覆蓋
  3. 支援乾跑模式 --dry-run 僅顯示不實際重命名
  4. 增加日誌記錄功能便於稽核

避坑指南

  • 避免在 for 迴圈中直接使用 ls 輸出(檔名含空白會出錯)
  • 目錄遍歷時注意符號連結可能導致無限迴圈
  • 大量檔案操作建議先備份或使用版控系統

此範例展示 Shell 遞迴函式的經典模式,可擴展應用於批次壓縮、編碼轉換、權限修改等場景。

Copyright © Windows教程網 All Rights Reserved