多个重命名文件

多个重命名文件

可能的重复:
如何清理文件扩展名?

我想将扩展名为 .flac.mp3 的文件重命名为扩展名为 .mp3。我使用了以下命令

$ for i in *; do mv $i `echo $i | sed 's/.flac//g'`; done

这将为每个文件写入以下错误消息。

mv: target `file.mp3' is not a directory

我哪里做错了?

谢谢

答案1

也许这些文件的名称包含空格。

shell编程的简单规则:始终在变量和命令替换周围使用双引号(除非您知道为什么需要将它们排除在外)。所以:

for i in *; do mv "$i" "$(echo "$i" | sed 's/.flac//g')"; done

当您执行此操作时,您可以在该命令中做得更好,即使它们不是问题的根源。您应该仅对应该影响的文件运行命令,而不是对当前目录中的每个文件运行命令。 sed 正则表达式.flac可以匹配扩展名以外的其他内容。如果您的文件名以-或 开头且包含反斜杠(某些版本为echo),则该命令也可能会失败。

for i in *.flac.mp3; do mv -- "$i" "$(echo "$i" | sed 's/\.flac\.mp3$/\.mp3/')"; done

但实际上您不必在这里使用 sed,有一个 shell 构造可以从字符串中删除后缀。

for i in *.flac.mp3; do mv -- "$i" "${i%.flac.mp3}.mp3"; done

--确保即使$i以 a 开头-,它也不会被解释为选项。另一种方法是确保$i从不以 开头-,例如确保所有相对文件名都以 为前缀./(这对指定的文件没有影响,因为.是当前目录)。

    对于 ./*.flac.mp3 中的 i;做 mv "$i" "${i%.flac.mp3}.mp3";完毕

有很多工具可以自动重命名文件;浏览这里有一些想法。例如,如果您的 shell 是 zsh:

autoload zmv    # goes into your .zshrc
zmv '(*).flac.mp3' '$1.mp3'

相关内容