avconv
Ich habe versucht, einige .ape-Dateien über die Befehlszeile in .flac-Dateien zu konvertieren . avconv
Das 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 .ape
dem Suffix gefunden und anschließend mit demselben Dateinamen und .flac
Suffix 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
find
Der Befehl liefert nur Dateien mit der Endung.Affe
Der find
Befehl gibt den relativen Pfad an avconv
, damit er diese Dateien konvertieren und im selben Ordner wie die Eingabedatei (z. B. .ape) ablegen kann.
find
Der Befehl findet alle Dateien in diesem Verzeichnis, unabhängig davon, wie tief sie im Unterverzeichnis abgelegt sind.