【问题标题】:why this bash script is not working when trying to rename existing files为什么在尝试重命名现有文件时此 bash 脚本不起作用
【发布时间】:2014-11-13 12:57:01
【问题描述】:

我有这个脚本和一个包含一些 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)

【问题讨论】:

标签: bash batch-rename


【解决方案1】:

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

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

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

感谢正确引用所有内容!

【讨论】:

  • 链接答案中的百分号是${var/}的后缀锚修饰符:"${i/%.fasta/.fa}"表示.fasta只有在出现在参数末尾时才会被.fa替换价值。作为类似sed 的替换,它看起来像s/\.fasta$/.fa/。 OP 可能将其误认为 * 以匹配任何前面的字符;它在这里的使用似乎试图匹配“Sip”之后的所有内容。
  • 当我发表评论时,您在回答中也提到了同样的事情:)
  • 实际上我今天学到了一些新东西,我之前没有偶然发现语法中的这种特殊变化。感谢@Benoit,无论您身在何处(-:
【解决方案2】:

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

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

$(...) 的内容在子shell 中执行,并且必须是i/Sip%/SIP 不是的常规代码。可能是笔误?

【讨论】:

    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2014-07-17
    • 2019-12-26
    • 2014-01-04
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多