天天看點

批量修改/替換檔案名稱和内容

暫時不支援空格和特殊字元,有大佬知悉的求告知,非常感謝!
#!/bin/sh

#原始字元串,越特殊的替換越需要放前面
modifySrcArray=(
"ZJBaseUtilsDef"
"ZJBaseUtils"
"zj_"
"ZJ"
)
#替換後的字元串,和前面一一對應
modifyDstArray=(
"TestAAUtilsDef"
"TestAASmartUtils"
"ts_"
"TS"
)

SHELL_PATH=`pwd`
SHELL_NAME=''

#修改檔案内容函數
function modify_file_content() {
    local modifyContentFile=$1

    echo "修改檔案内容:$modifyContentFile"
    for (( i = 0; i < ${#modifySrcArray[@]}; i++ ))
    do
        perl -pi -e 's|'${modifySrcArray[$i]}'|'${modifyDstArray[$i]}'|g' $modifyContentFile
        #替換規則:"s|查找的字元串|替換的字元串|g"
    done
}

#修改檔案名稱特殊字元
function modify_file_name() {
    local modifyNameFile=$1
    
    local dname=`dirname $modifyNameFile`        #擷取上級目錄
    local fname=`basename $modifyNameFile`        #擷取檔案名
    for (( i = 0; i < ${#modifySrcArray[@]}; i++ ))
    do
        #暫不支援帶空格的檔案名修改
        spaceResult=$(echo ${modifySrcArray[$i]} | grep " ")
        if [[ "$spaceResult" != "" ]]
        then
           continue
        fi
         
#        fname=`echo $fname | awk '{gsub(/${modifySrcArray[$i]}/,"${modifyDstArray[$i]}"); print }'`
        fname=`echo $fname | sed 's|'${modifySrcArray[$i]}'|'${modifyDstArray[$i]}'|g'` #查找替換字元

        if [ "$fname" != "" ]
        then
            local newfile=$dname/$fname   #新檔案的路徑
            if [ "$modifyNameFile" != "$newfile" ]  #不相等時修改檔案名稱
            then
                mv $modifyNameFile $newfile
                echo "修改檔案名稱:$modifyNameFile -> $newfile"
                break
            fi
        else
            echo "替換規則錯誤:${modifySrcArray[$i]} -> ${modifyDstArray[$i]}"
        fi
    done
}

#周遊所有檔案夾
function traverseFolder() {
    local folder=$1
    if [ "$folder" == "" ]
    then
        echo "未填入需修改的檔案夾路徑,退出程式!"
        exit
    fi
    
    #擷取腳本的路徑,後面阻止修改腳本内容
    if [ "$SHELL_NAME" = "" ]
    then
        fname=`basename $0`
        SHELL_NAME=`pwd`/$fname
    fi

    #将./轉換為絕對路徑
    if [[ "$folder" == ./* ]];then
        local pwdPath=`pwd`
        folder=`echo $folder | sed 's|./|'$pwdPath'|g'`
    fi
    
    #将.轉換為絕對路徑
    if [ "$folder" == "." ];then
        folder=`pwd`
    fi
    
    for file in $(ls $folder)
    do
        local targetFile=$folder/$file
        
        if test -f $targetFile
        then
            if [ "$targetFile" != "$SHELL_NAME" ]
            then
                modify_file_content $targetFile     #修改檔案内容
                modify_file_name $targetFile        #修改檔案名稱
            fi
        fi

        if test -d "$targetFile"
        then
            traverseFolder $targetFile      #循環周遊檔案夾
            modify_file_name $targetFile
        fi
    done
}

#執行周遊修改檔案
traverseFolder $1

           

繼續閱讀