For loop 在for循环中使用mv和sed批重命名文件会导致退出代码64-如何更正脚本?

For loop 在for循环中使用mv和sed批重命名文件会导致退出代码64-如何更正脚本?,for-loop,sed,terminal,echo,mv,For Loop,Sed,Terminal,Echo,Mv,我正在尝试重命名几百个文件夹,以删除文件夹名称前的数字。我似乎已经完成了大部分工作,但我的脚本还不太管用。当我回显脚本创建的命令而不是运行这些命令时,一切看起来都很好。剧本: 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

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

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循环中工作?我如何更正此脚本?

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

此外,您应该避免使用易碎的
$(echo…| sed…
;这可以在纯外壳中实现:

for f in *; do
    g=${f#[0-9]}; g=${g#[0-9]}; g=${g#[0-9]}
    echo mv "$f" "${g# }"
done
如果要验证
echo
是否获得正确的报价,请使用
sh-x
运行。然后移除
echo
以实际移动


复制/粘贴时输出有效的原因是,从
echo
复制输出时,实际上需要第二级引用。一个(危险的、复杂的)解决方法是将
echo
替换为
eval

欢迎来到SO Christopher!我对你的帖子进行了编辑,使其更加清晰。谢谢你的编辑,布莱恩。
echo|sed
的bash翻译可以是:
shopt-s extglob;g=${f#[0-9]?([0-9])?([0-9])}
非常感谢,tripleee。我的古怪的引用和“脆弱”的方法都来自大量的尝试,大量的错误,而没有太多的先验知识。就后者而言,我将花一些时间精确地计算出你剧本第二行(以及格伦·杰克曼的第二行)中发生了什么。在摘要中,我了解到,通过反复修改
$g
,您正在从
$f
的开头一次删除一个数字。只是不知道为什么
${g#[0-9]}
会这样做;其中的
#
对我来说是新的。替换记录在
bash
手册页面中,或例如在