我有这个脚本和带有一些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)
答案 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
不是的常规代码。也许是一个错字?