0

我正在尝试重命名数百个文件夹以删除以文件夹名称为前缀的数字。我似乎已经完成了大部分工作,但是我的脚本还不能正常工作。当我echo使用脚本创建的命令而不是运行这些命令时,一切看起来都很好。剧本:

for file in *
do
    echo mv "'"$file"'" $(echo "'"$file"'" | sed 's/[0-9]\{1,3\} //')
done

返回多行:

mv '123 filename' 'filename'
mv '99 another name' 'another name'
. . . etc.

如果我采用这些行之一并在命令行上使用,则该文件夹将被适当地重命名。但是,如果我删除echo以实际运行这些mv命令,它们将不起作用。相反,mv当您以某种方式错误地输入命令时,会打印出使用提醒。

为什么输出命令单独工作,而不是在 for 循环中?如何更正此脚本?

4

1 回答 1

1

你的引用看起来很奇怪。变量应该用双引号括起来,不多也不少。

此外,您应该避免脆性$(echo ... | sed ...);这可以在纯 shell 中完成:

for f in *; do
    g=${f#[0-9]}; g=${g#[0-9]}; g=${g#[0-9]}
    echo mv "$f" "${g# }"
done

sh -x如果您想验证echo引用是否正确,请运行。然后删除echo实际移动。

复制/粘贴时输出有效的原因是,从echo. 一个(有风险的、复杂的)解决方法是echoeval.

于 2013-04-18T16:48:07.213 回答