我尝试使用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
命令将找到该目录中的所有文件,无论它们在子目录中保存的深度如何