尝试重命名现有文件时,为什么此bash脚本无法正常工作

时间:2014-11-13 12:57:02

标签: bash batch-rename

我有这个脚本和带有一些Sip_ *文件的dir文件,我需要将它们重命名为SIP _ *

for i in Sip_R*.csv
do
   echo "processing $i"
   NEWNAME="$(i/Sip%/SIP)"
   echo "newname is $NEWNAME"
   mv -- "$i" "$NEWNAME"
done

我收到了

 processing Sip_Reg-generated1415879496958.csv
 digest-reg-files.sh: line 5: i/Sip%/SIP: No such file or directory
 newname is
 mv: cannot move `Sip_Reg-generated1415879496958.csv' to `': No such file or directory
 processing Sip_Reg-generated1415879504694.csv
 digest-reg-files.sh: line 5: i/Sip%/SIP: No such file or directory
 newname is
 mv: cannot move `Sip_Reg-generated1415879504694.csv' to `': No such file or directory

我修改了Renaming multiples files with a bash loop提供的解决方案,但它无效。

机器是一些centos,2.6.32-358.el6.x86_64,bash版本是4.1.2(1)-release(x86_64-redhat-linux-gnu)

2 个答案:

答案 0 :(得分:2)

你的括号很古怪。 Bash中字符串替换的语法使用花括号,而不是圆括号。

另外,就像the answer you link to解释的那样,百分号将替换锚定到字符串的末尾,这不是你想要的。使用/#代替锚定到字符串的开头;或者您可以使用${i/Sip/SIP}来完全不锚定(您已经知道第一次出现在字符串的开头)。

NEWNAME="${i/#Sip/SIP}"

赞赏所有内容!

答案 1 :(得分:1)

上面提到的原始解决方案使用类似(在您的情况下):

NEWNAME="$( echo "$i" | sed -e 's/Sip/SIP/' )"

$(...)的内容在子shell中执行,并且必须是i/Sip%/SIP不是的常规代码。也许是一个错字?