Linux:如何获取具有不同扩展名的批量转换的相同输出文件名?

Linux:如何获取具有不同扩展名的批量转换的相同输出文件名?

我正在使用 Timidity 将许多 midi 文件转换为 mp3。我想知道是否有一种标准方法来指定输出模式,以便将所有文件转换*.mid/path/*.wav

我一般会问这个问题,因为在命令中也会这样mv。还是这与应用程序中的特定实现有关?

那么,如何将 *.mid 文件移动到 *.wav?

答案1

假设您只想重命名文件。那么如果您使用的是 Bourne shell(例如sh, bash),则可以使用循环对与模式匹配的文件运行该命令for。以下是等效的多行和单行版本:

for f in *.mid
do
    mv "$f" "${f%.mid}.wav"
done
for f in *.mid; do mv "$f" "${f%.mid}.wav"; done

循环运行带有 扩展中的每个单词的for命令,并删除后缀,以便我们可以将其替换为。引号使此程序对于包含空格的文件名正确(但对于以“-”开头的文件名不正确,因为这取决于命令)。如果您想匹配多组文件而不是所有内容,则可以使用多个模式,例如$f*.mid${f%.mid}.mid.wavfor f in alpha-*.mid beta-*.mid; do ...

你可以用任何你想要的命令来代替mv。我看了一下 Timidity 的手册页,但我不明白它在哪里获取输出文件名,所以我没有给出例子。

答案2

我制作了一个将 *.mid 移动到 *.wav 的 python 脚本。

#!/usr/bin/python2.7

import sys
import glob
import shutil
import os

try:
    dir = sys.argv[1]
except IndexError:
    print "Usage: "+sys.argv[0]+" dir"
    print "Example: "+sys.argv[0]+" /home/user/dir"
    sys.exit(1)

for file in glob.glob(os.path.join(dir, '*.mid')):
    newfile = file.partition(".mid")
    newfile = newfile[0]
    newfile = newfile+".wav"
    shutil.move(file, newfile)

相关内容