我正在寻找以下结构的脚本:
之前:
/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
但它会引发错误.. :(
我怎么能写它来根据文件夹名重命名文件?
答案 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")