bash中的全局重命名

bash中的全局重命名,bash,echo,space,glob,mv,Bash,Echo,Space,Glob,Mv,我是bash的新手,如果这是一个基本问题,我很抱歉。我试图重命名一堆mp3文件,将1-前置到它们的文件名中,不幸的是mv*.mp3 1-*.mp3没有工作。因此我尝试编写脚本,首先使用echo测试命令: for f in *.mp3 ; do echo mv \'$f\' \'1-$f\'; done 它似乎输出了我喜欢的命令,所以我删除了echo,将命令改为 for f in *.mp3 ; do mv \'$f\' \'1-$f\'; done 失败了。接下来,我试着像这样把命令向前传送

我是bash的新手,如果这是一个基本问题,我很抱歉。我试图重命名一堆mp3文件,将
1-
前置到它们的文件名中,不幸的是
mv*.mp3 1-*.mp3
没有工作。因此我尝试编写脚本,首先使用echo测试命令:

for f in *.mp3 ; do echo mv \'$f\' \'1-$f\'; done
它似乎输出了我喜欢的命令,所以我删除了echo,将命令改为

for f in *.mp3 ; do mv \'$f\' \'1-$f\'; done
失败了。接下来,我试着像这样把命令向前传送

for f in *.mp3 ; do echo mv \'$f\' \'1-$f\'; done | /bin/sh

这很有效,但是如果有人能告诉我为什么中间命令不起作用,我很想知道。或者,如果有一个更优雅的单行程序可以满足我的要求,我也很想看到它。

我想您必须将命令更改为

for f in *.mp3 ; do mv "$f" "1-$f"; done
否则,您会将类似于
'file1.mp3'
'1-file1.mp3'
的内容传递到
mv
(包括单引号)。

干运行:

rename -n 's/^/1-/' *.mp3

如果运行命令看起来正确,请删除
-n
manrename
了解详细信息。

我打算包含单引号,否则我需要用反斜杠转义所有空格。mv不介意引用。但是,文件名中也可以有“和”。在
$f
周围使用双引号时,不需要转义空格。如果文件名包含单引号或双引号,也没有问题。这适用于Debian,但不适用于CentOS,因为在CentOS上,重命名命令不遵循此语法,而且功能要弱得多。