web-dev-qa-db-ja.com

すべての.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 ??!??を使用)

9
tigerjack89

必要なコマンドは次のとおりです。

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

これにより、.ape接尾辞を持つ各ファイルが検索され、.flac接尾辞を持つ同じファイル名で元のファイルと同じ場所に変換されます。

{}は、現在見つかっているファイルのパスです。
here のテストを参照してください

13
αғsнιη

以下の(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
1
Jacob Vlijm

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 "$@"' _ "{}"
0
user1133275