将不同子文件夹中的所有 .ape 文件转换为 .flac

将不同子文件夹中的所有 .ape 文件转换为 .flac

我尝试使用avconv命令行将一些 .ape 文件转换为 .flac 文件;显然,avconv这不是这里的重点;它的语法非常简单avconv -i inputApeFile.ape outputFlacFile.flac

问题是这些文件嵌套在多个子文件夹中;例如,我有 Artist 文件夹,然后是各种 CD 子文件夹,每个子文件夹都包含不同的 .ape 文件。我如何转换所有文件,然后将它们保存在原始文件的同一文件夹中,但使用 .flac 扩展名?

如果可能的话,我想在一行中只使用 shell 命令而不使用脚本。我认为应该是这样的

avconv -i 'ls -R | grep ape' '???'

但我被困在第二部分(也许使用sed??!?)

答案1

您需要的命令是:

find /path/to/MainDir/ -type f -name "*.ape"  -execdir sh -c ' avconv -i "$1" "${1%.ape}.flac" ' _ {} \;

这将找到每个具有.ape后缀的文件,然后使用带有后缀的相同文件名将其转换.flac为与原始文件所在的相同位置。

{}是当前找到的文件的路径。
参见这里

答案2

下面的 (python) 脚本应该可以完成这项工作。将其复制到一个空文件中,将其另存为convert.py,将目录设置为脚本头部部分的文件 ( convert_dir =),然后通过以下命令运行它:

python3 /path/to/convert.py

剧本

#!/usr/bin/env python3

convert_dir = "/path/to/folder/tobeconverted"

import os
import subprocess

for root, dirs, files in os.walk(convert_dir):
    for name in files:
        if name.endswith(".ape"):
            # filepath+name
            file = root+"/"+name
            # to use in other (convert) commands: replace the "avconv -i" by your command, and;
            # replace (".ape", ".flac") by the input / output extensions of your conversion
            command = "avconv -i"+" "+file+" "+file.replace(".ape", ".flac")
            subprocess.Popen(["/bin/bash", "-c", command])
        else:
            pass

答案3

现在 ffmpeg 再次比 avconv 更受欢迎,并且有便宜的多核计算机(8 核 XU4 售价 60 美元),我发现以下方法最有效;

#!/bin/bash

#
# ape2flac.sh
#

function f2m(){
        FILE=$(echo "$1" | perl -p -e 's/.ape$//g');
        if [ ! -f "$FILE".flac ] ; then
                ffmpeg -v quiet -i "$FILE.ape" "$FILE.flac"
        fi
}
export -f f2m
find "$FOLDER" -name '*.ape' | xargs -I {} -P $(nproc) bash -c 'f2m "$@"' _ "{}"

答案4

您正在寻找的一行命令:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
find命令将仅提供以。猿
find命令将为命令提供相对路径,avconv以便它可以转换这些文件并将它们保存在与输入文件(即 .ape)相同的文件夹中。
find命令将找到该目录中的所有文件,无论它们在子目录中保存的深度如何

相关内容