用于从其父文件夹重命名多个文件的Shell脚本

时间:2014-03-24 08:58:15

标签: regex linux shell sh rename

我正在寻找以下结构的脚本:

之前:

/Description/TestCVin/OpenCVin/NameCv/.....
/Description/blacVin/baka/NameCv_hubala/......
/Description/CVintere/oldCvimg/NameCv_add/.....

后:

/Description/TestaplCVin/OpenaplCVin/NameaplCv/.....
/Description/blaapcVlin/baka/NameaplCv_hubala/......
/Description/aplCVintere/oldaplCvimg/NameaplCv_add/.....

我想重命名" Cv或CV或cV" >> " aplCv或aplCV或aplcV"在所有文件夹中通过正则表达式...

我的脚本看起来像:

#!/bin/sh

printf "Input your Directory path: -> "

read DIR

cd "$DIR"

FILECASE=$(find . -iname "*cv*")

LAST_DIR_NAME=""

for fdir in $FILECASE
do
        if [[ -d $fdir ]];
        then
            LAST_DIR_NAME=$fdir

        fi

        FILE=$(echo $fdir | sed -e "s/\([Cc][Vv]\)/arpl\1/g")
        echo "la file $FILE"
        if ([[ -f $fdir ]] && [[ "$fdir" =~ "$LAST_DIR_NAME" ]]);
        then
           FILECASE=$(find . -iname "*cv*")

            tmp=$(echo $LAST_DIR_NAME | sed -e "s/\([Cc][Vv]\)/arpl\1/g")
            fdir=$(echo $fdir | sed -e 's|'$LAST_DIR_NAME'|'$tmp'|g')
        fi

        mv -- "$fdir" "$FILE"
done

但它会引发错误.. :(

我怎么能写它来根据文件夹名重命名文件?

2 个答案:

答案 0 :(得分:0)

在使用此类脚本之前,请务必进行备份。

您可以尝试以下操作:

find . -iname '*cv*' -exec echo 'mv {} $(echo $(dirname {})/$(basename {}|sed s/cv/apl/gi))' \;|tac|xargs -i bash -c 'eval {}'

这使用-exec来打印重命名命令。 第二个参数是通过使用shell替换在路径的最后部分用apl替换cv生成的。 tac用于反转命令的顺序,因此在处理目录之前我们不会重命名目录。 最后,我们用bash评估命令。

另外,请勿在永久脚本中使用-exec。请在查找手册页中阅读有关exec的安全警告。

答案 1 :(得分:0)

你可以这样做

#!/bin/sh

printf "Input your Directory path: -> "
read DIR
cd "$DIR"
MYARRAY=$(find . -iname "*cv*" )

touch "tmpfile"

for fdir in $MYARRAY
do
    echo "$fdir" >> "tmpfile"
done

MYARRAY=$(tac "tmpfile")

for fdir in $MYARRAY
do
    cd "$fdir"
    prev=$(cd -) 
    base=$(basename $fdir)
    cd ..
    nDIR=$(echo "$base" | sed -e "s/\([Cc][Vv]\)/arpl\1/g") 
    mv "$base" "$nDIR"
    cd $prev    
done

rm -f "tmpfile"

另外一个问题我认为tac命令未包含在Mac OS X中。相反tac使用tail -r,如MYARRAY=$(tail -r "tmpfile")