すべての .ape ファイルを異なるサブフォルダ内の .flac に変換する

すべての .ape ファイルを異なるサブフォルダ内の .flac に変換する

avconv私はコマンドラインを使用していくつかの .ape ファイルを .flac ファイルに変換しようとしていましたが、明らかに、avconvそれはここでの主題ではありません。その構文は非常に簡単ですavconv -i inputApeFile.ape outputFlacFile.flac

ポイントは、ファイルが複数のサブフォルダにネストされていることです。つまり、Artist フォルダがあり、その下にさまざまな CD サブフォルダがあり、それぞれに異なる .ape ファイルが含まれています。すべてのファイルを変換し、元のファイルと同じフォルダに .flac 拡張子を付けて保存するにはどうすればよいでしょうか。

可能であれば、スクリプトを使わずにシェルコマンドのみを1行で使用したいのですが、次のような感じになると思います

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

しかし、2 番目の部分で行き詰まっています (おそらく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

あなたが探していた1行のコマンド:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findコマンドは、.ape
コマンドはコマンドfindへの相対パスを与えるavconvので、それらのファイルを変換して入力ファイル(.apeなど)と同じフォルダに保存することができます。
findコマンドは、サブディレクトリの深さに関係なく、そのディレクトリ内のすべてのファイルを検索します。

関連情報