Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Shell脚本,用于重命名其父文件夹中的多个文件_Regex_Linux_Shell_Sh_Rename - Fatal编程技术网

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”)仍然错误:(。。