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


9

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

关键是文件嵌套在更多的子文件夹中。即,我有Artist文件夹,然后有各种CD子文件夹,每个子文件夹包含不同的.ape文件。如何转换所有文件,然后将其保存在原始文件的同一文件夹中,但扩展名为.flac?

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

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

但我坚持使用第二部分(也许使用sed??!?)

Answers:


13

您需要的命令是:

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

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

{}是当前找到的文件的路径。
这里查看测试


1

下面的(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

感谢您的答复和您的宝贵时间Jacob。但是,如果可能的话,我只想在一行中仅使用shell命令而不使用脚本(抱歉,我之前必须对此进行指定)
tigerjack89 2014年

1
@ tigerjack89好吧,也许其他人可以在类似情况下使用它。语法<command> <inputfile> <outputfile>很常见。
Jacob Vlijm 2014年

0

现在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 "$@"' _ "{}"

-1

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


2
这行不通;avconv不能像这样从STDIN接收输入文件。
evilsoup 2014年

1
那输出文件夹呢?
tigerjack89 2014年

@evilsoup我已经更新了答案,xargs可以解决问题。请尝试这个。
爱德华·托瓦尔兹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.