重命名意外具有多个 .mp3 扩展名的 Linux 文件

重命名意外具有多个 .mp3 扩展名的 Linux 文件

我搞砸了,意外地得到了一堆带有扩展名的文件.mp3.mp3.mp3.mp3

我怎样才能以递归方式(并在多个目录中)更改这些内容以将它们设置为.mp3

答案1

有一个相当简单的解决方案,就是从第一个“.mp3”中删除所有内容,然后再添加“.mp3”。所以:

for file in $(find . -name "*.mp3"); do mv "$file" "${file%%.mp3*}.mp3"; done

答案2

使用renameperl 附带的实用程序(在某些系统上可能称为perl-rename)和带有的 shell **(zsh 或 bashshopt -s globstar等):

rename 's/(\.mp3)+$/.mp3/' /somedir/**/*.mp3

答案3

使用find命令bash和一些创造性的脚本,可以神奇地清理这个问题。以下脚本在 Mac OS X 10.9.5 上进行了测试,但在 Linux 上也应该可以正常工作。首先将其作为“试运行”运行,以确保您定位正确的文件:

find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
  while read RAW_FILE
  do
    DIRNAME=$(dirname "$RAW_FILE")
    BASENAME=$(basename "$RAW_FILE")
    FILENAME="${BASENAME%%.*}"
    EXTENSION="${BASENAME#*.}"
    echo "mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3"
  done

您首先应更改/path/to/your/files以匹配系统上受影响文件的实际路径。还请注意最后一行,它是echomv(移动)命令。我这样做是为了确保脚本针对正确的文件。

核心find逻辑是这样的:

find '/path/to/your/files' -type f -name '*.mp3.mp3*'

这基本上意味着,“查找路径中所有/path/to/your/files实际是文件(而不是目录)且文件名模式与 匹配的文件。 *.mp3.mp3*这应该捕获任何/所有附加了多个 的文件.mp3.mp3.mp3,,,,等等....mp3.mp3.mp3.mp3.mp3.mp3.mp3.mp3.mp3.mp3.mp3.mp3

该脚本不会费心去处理只有正确文件的文件,.mp3如果只有一小部分文件命名错误,.mp3.mp3.mp3.mp3而不必重命名所有文件,这绝对是一个速度优势.mp3

mv因此,当您运行该命令时,您应该会看到一个可以解决您的问题的“dry run”命令列表:找到所有这些.mp3文件并将它们重命名为正确的单数.mp3

现在运行良好,只需像这样运行最终脚本:

find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
  while read RAW_FILE
  do
    DIRNAME=$(dirname "$RAW_FILE")
    BASENAME=$(basename "$RAW_FILE")
    FILENAME="${BASENAME%%.*}"
    EXTENSION="${BASENAME#*.}"
    mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3
  done

请注意,最后一行是实际的功能mv命令。当您运行此版本的脚本时,将搜索整个目录以查找这些文件.mp3,然后实际运行完整mv命令来解决问题。

相关内容