Regex Shell脚本,用于重命名其父文件夹中的多个文件
我正在寻找以下结构的脚本: 之前:Regex Shell脚本,用于重命名其父文件夹中的多个文件,regex,linux,shell,sh,rename,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/Nameap
/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
但它抛出了一个错误(
如何编写它以根据文件夹名称重命名文件?在使用此类脚本之前,请始终进行备份 您可以尝试以下操作:
find . -iname '*cv*' -exec echo 'mv {} $(echo $(dirname {})/$(basename {}|sed s/cv/apl/gi))' \;|tac|xargs -i bash -c 'eval {}'
这将使用-exec打印用于重命名的命令。
第二个参数是通过在路径的最后一部分使用shell替换将cv替换为apl生成的。
tac用于颠倒命令的顺序,以便在处理目录内容之前不重命名目录。
最后,我们使用bash评估命令
另外,不要在永久脚本中使用-exec。请阅读查找手册页中有关exec的安全警告。您可以这样做
#!/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"
还有一个问题,我认为Mac OS X中不包括
tac
命令。相反tac
使用tail-r
类似MYARRAY=$(tail-r“tmpfile”)
。通过调节器异常
…那是什么?…调节器表达式:D…我写错了拼写引发了什么错误?你能帮我吗?devnull。我搜索了4天,但没有得到我想要的结果。错误:mv:rename./Description/testaplaplin to:没有这样的文件或目录………你好,Trygve Flathen。谢谢。现在我是ve阅读您的所有帮助。我正在观察并修改了我的请求。请求“apl”被插入到文件或文件夹“cv,cv,cv”的前面(.我之前错了..在发布时,我的英语水平不好。在这种情况下,你应该能够在sed中使用我的方法处理你原来的正则表达式。我将它简化了一点,并将行为更改为你修改后的请求:find.-iname'*cv*'-exec echo'mv{}$(dirname{})/$(basename{}sed'\''s/\(cv\)/apl\1/gi'\)“\| tac | sh
你好!@Jayesh。非常感谢。我不得不依赖它。看到代码可能和我认为他的逻辑一样正确。明天打开他的电脑打字。看看它是如何真正感谢Jayesh:)。在你发布的脚本中。我运行了它。但是警告erro“第15行:tac:找不到命令”为什么???您使用的是哪个系统?如果MAC osx可能不支持它们,那么使用tail-r
。我使用的系统是MAC osx…..但是将MYARRAY=$(tail-r“tmpfile”)替换为MYARRAY=$(tac“tmpfile”)仍然错误:(。。