我尝试使用一些变量来重命名一些文件,但它失败了。我已经尝试了不同的方式让它工作,但无济于事。据我了解文档,这是正确的做事方式 - 但现在我很难过......
这是代码(写在文件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
最初我认为问题在于使用我认为是正则表达式的变量,但从错误消息中可以看出,问题在于首先声明变量的地方。
这里发生了什么?
答案 0 :(得分:4)
这可以完全在shell中完成,这也避免了为sed替换模式转义元字符的可能问题。它也非常快,因为每个文件重命名可以节省两个叉子。
NEWPREF="LALA"
OLDPREF="LULU"
for f in "$OLDPREF"*; do
mv "$f" "$NEWPREF${f#$OLDPREF}"
done
如果您想了解有关从shell变量值中删除后缀和前缀的更多信息,请阅读POSIX spec on parameter expansion(所有zsh,ksh,mksh和bash支持)。
PS:如果您在rename_prefix.sh: line 2: NEWPREF: command not found
之后和NEWPREF
之前有空格,那么唯一方式可以获得=
之类的错误。它看起来非常像您发布的程序并不完全是您运行的程序。你输入它而不是cut'n'paste吗?
答案 1 :(得分: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