Konvertieren Sie alle .ape-Dateien in .flac in verschiedenen Unterordnern

Konvertieren Sie alle .ape-Dateien in .flac in verschiedenen Unterordnern

avconvIch habe versucht, einige .ape-Dateien über die Befehlszeile in .flac-Dateien zu konvertieren . avconvDas ist hier natürlich nicht der Hauptpunkt. Die Syntax ist ziemlich unkompliziert avconv -i inputApeFile.ape outputFlacFile.flac.

Der Punkt ist, dass die Dateien in mehreren Unterordnern verschachtelt sind. Ich habe beispielsweise den Ordner „Artist“ und dann mehrere CD-Unterordner, die jeweils unterschiedliche .ape-Dateien enthalten. Wie kann ich alle Dateien konvertieren und sie dann im selben Ordner wie die Originaldatei, aber mit der Erweiterung .flac speichern?

Wenn möglich, würde ich gerne nur Shell-Befehle in einer einzigen Zeile verwenden, ohne Skripte zu verwenden. Ich denke, es sollte so etwas sein

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

aber ich stecke beim zweiten Teil fest (vielleicht mit sed??!?)

Antwort1

Der Befehl, den Sie benötigen, ist:

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

Dadurch werden alle Dateien mit .apedem Suffix gefunden und anschließend mit demselben Dateinamen und .flacSuffix an denselben Speicherort konvertiert, an dem sich die Originaldatei befindet.

{}ist der Pfad der aktuell gefundenen Datei.
Siehe den Test vonHier

Antwort2

Das folgende (Python-)Skript sollte die Aufgabe erfüllen. Kopieren Sie es in eine leere Datei, speichern Sie es unter convert.py, legen Sie das Verzeichnis auf die Dateien im Kopfabschnitt des Skripts fest ( convert_dir =) und führen Sie es mit dem folgenden Befehl aus:

python3 /path/to/convert.py

Das Drehbuch

#!/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

Antwort3

Da ffmpeg nun wieder avconv vorgezogen wird und es günstige Many-Core-Computer gibt (60 $ für einen 8-Core-XU4), habe ich Folgendes als am effektivsten empfunden:

#!/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 "$@"' _ "{}"

Antwort4

Einzeiliger Befehl, den Sie gesucht haben:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findDer Befehl liefert nur Dateien mit der Endung.Affe
Der findBefehl gibt den relativen Pfad an avconv, damit er diese Dateien konvertieren und im selben Ordner wie die Eingabedatei (z. B. .ape) ablegen kann.
findDer Befehl findet alle Dateien in diesem Verzeichnis, unabhängig davon, wie tief sie im Unterverzeichnis abgelegt sind.

verwandte Informationen