可能的重复:
如何清理文件扩展名?
我想将扩展名为 .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'