【问题标题】:Shell script to rename multiple files from their parent folders用于重命名父文件夹中的多个文件的 Shell 脚本
【发布时间】:2014-05-01 12:57:11
【问题描述】:

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

之前:

/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 or CV or cV”>>“aplCv or aplCV or 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

但它会抛出一个错误..:(

如何编写它以根据文件夹名称重命名文件?

【问题讨论】:

  • .. by regulator exception ... 那是什么?
  • ...调节器表达式:D..我写错了拼写
  • 抛出了什么错误?
  • 你能帮帮我吗?开发空。我搜索了 4 天,但没有得到我想要的结果。
  • error : mv: rename ./Description/Testaplaplaplin to : No such file or directory ....

标签: regex linux shell sh rename


【解决方案1】:

你可以这样做

#!/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")

【讨论】:

  • 你好! @Jayesh。非常感谢您。我不得不依靠它。并且看到代码可能是正确的,因为我认为他的逻辑。明天打开他的电脑打字。看看它如何真正感谢 Jayesh :)。
  • 在您发布的脚本中。我运行它。但警告错误“第 15 行:tac:找不到命令”为什么????
  • 您使用的是哪个系统?
  • 如果 MAC osx 它们可能不受支持,请使用tail -r
  • 我使用的系统是 Mac osx .....但是将 MYARRAY=$(tail -r "tmpfile") 替换为 MYARRAY=$(tac "tmpfile") 仍然错误:( ..跨度>
【解决方案2】:

在玩这类脚本之前一定要做好备份。

您可以尝试以下方法:

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。请阅读 find 手册页中有关 exec 的安全警告。

【讨论】:

  • 你好,Trygve Flathen .所以谢谢你。现在我已经阅读了您的所有帮助。我在看,我已经修改了我的请求。请求“apl”被插入到文件或文件夹“cv, CV, CV Cv”的前面。:(。我之前错了..虽然post,我的英语水平不好。
  • 在这种情况下,您应该可以在 sed 中将我的方法与您的原始正则表达式一起使用。
  • 我将其简化了一点,并将行为更改为您修改后的请求:find . -iname '*cv*' -exec echo 'mv {} $(dirname {})/$(basename {}|sed '\''s/\(cv\)/apl\1/gi'\'')' \;|tac|sh
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2013-05-02
  • 2016-03-14
  • 2021-11-30
相关资源
最近更新 更多