2011-05-04 56 views
5

对于bash,我很新,所以很遗憾,如果这是一个基本问题。我试图重命名一堆mp3文件,以便将它们的文件名加上1-,并且mv *.mp3 1-*.mp3不起作用。所以我试图脚本它,先用回声测试的命令:Glob在bash中重命名

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

这似乎输出我喜欢的命令,所以我删除了回声,改变了命令

for f in *.mp3 ; do mv \'$f\' \'1-$f\'; done 

哪失败。接下来,我试图管道命令以后,像这样

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

其中的工作,但如果有人可以赐教,为什么中间命令不工作,我很想知道。或者,如果有一种更加优雅的单行程可以做我想做的事情,我也会很有兴趣看到这一点。

回答

7

我认为你必须命令更改为

for f in *.mp3 ; do mv "$f" "1-$f"; done 

否则,你会通过类似'file1.mp3''1-file1.mp3'mv(包括单引号)。

+0

我打算包括单引号,因为否则我需要用反斜杠将所有空格转义。 MV不介意报价。然而,这些文件名也可以包含“in”(和“就此而言) – wim 2011-05-04 12:09:40

+0

当你在'$ f'周围使用双引号时,你不需要转义空格,如果文件名包含单双引号 – bmk 2011-05-04 12:28:59

7

空运行:

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

取出-n,如果它看起来是正确运行的命令。 man rename了解详情。

+1

这适用于Debian,但不适用于CentOS,其中rename命令不遵循此语法并且功能强大得多。 – 2017-05-29 10:51:20