1

我尝试使用一些变量来重命名一些文件,但它失败了。我尝试了不同的方法让它工作,但无济于事。据我了解文档,这是正确的做事方式 - 但是现在我很难过......

这是代码(如文件中所写rename_prefix.sh):

 #!/bin/sh
 NEWPREF="LALA"
 OLDPREF="LULU"
 for f in $OLDPREF*; do mv $f $(echo $f | sed 's/^$OLDPREF/$NEWPREF/g'); done

这是错误消息:

 usage: mv [-f | -i | -n] [-v] source target
   mv [-f | -i | -n] [-v] source ... directory

最初我认为问题在于使用我认为是正则表达式的变量,但从错误消息中可以看出,问题在于首先声明变量的位置。

这里发生了什么?

4

2 回答 2

4

这可以完全在 shell 中完成,这也避免了为 sed 替换模式转义元字符的可能问题。它也非常快,因为它为每个重命名的文件节省了两个分叉。

NEWPREF="LALA"
OLDPREF="LULU"
for f in "$OLDPREF"*; do
   mv "$f" "$NEWPREF${f#$OLDPREF}"
done

如果您想了解有关从 shell 变量值中删除后缀和前缀的更多信息,请阅读关于参数扩展的 POSIX 规范(zsh、ksh、mksh 和 bash 都支持)。

PS:你会得到一个错误的唯一方法rename_prefix.sh: line 2: NEWPREF: command not found是如果你NEWPREF=. 看起来您发布的程序与您运行的程序非常相似。您是键入它而不是剪切粘贴它吗?

于 2013-03-22T09:24:55.077 回答
0

好吧,假设您不需要 POSIX,并且猜测某些其他细节,这与应用了一般更正的情况相同。

#!/bin/bash
newpref=LALA
oldpref=LULU

shopt -s nullglob

for f in "$oldperf"*; do
    mv -- "$f" "${f/#"$oldpref"/$newpref}"
done

或 POSIX

#!/bin/sh
newpref=LALA
oldpref=LULU

for f in "$oldpref"*; do
    [ -e "$f" ] || break
    mv -- "$f" "${newpref}${f#"$oldpref"}"
done
于 2013-03-22T09:25:38.557 回答