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

9

Ich habe versucht, einige .ape-Dateien mithilfe der avconvBefehlszeile in .flac-Dateien zu konvertieren . offensichtlich avconvist hier nicht der Hauptpunkt; Die Syntax ist ziemlich einfach avconv -i inputApeFile.ape outputFlacFile.flac.

Der Punkt ist, dass die Dateien in mehr Unterordnern verschachtelt sind; Das heißt, ich habe den Artist-Ordner und dann verschiedene CD-Unterordner, von denen jeder unterschiedliche .ape-Dateien enthält. Wie kann ich alle Dateien konvertieren und sie dann im selben Ordner wie die Originaldatei speichern, jedoch mit der Erweiterung .flac?

Wenn es möglich ist, möchte ich nur den Shell-Befehl in einer einzelnen Zeile ohne Verwendung von Skripten verwenden. Ich denke, es sollte so etwas sein

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

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

tigerjack89
quelle

Antworten:

13

Der Befehl, den Sie benötigen, lautet:

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

Dadurch wird jede Datei mit dem .apeSuffix 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.
Sehen Sie den Test von hier aus

αғsнιη
quelle
1

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

python3 /path/to/convert.py

Das Skript

#!/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 Vlijm
quelle
Danke für deine Antwort und deine Zeit, Jacob. Wenn es jedoch möglich ist, möchte ich nur den Shell-Befehl in einer einzelnen Zeile ohne Skript verwenden (Entschuldigung, das musste ich vorher angeben)
tigerjack89
1
@ tigerjack89 Nun, vielleicht könnte jemand anderes es in ähnlichen Situationen verwenden; Die Syntax <Befehl> <Eingabedatei> <Ausgabedatei> ist ziemlich häufig.
Jacob Vlijm
0

Jetzt, da ffmpeg wieder gegenüber avconv bevorzugt wird und es viele billige Kerncomputer gibt (60 US-Dollar für eine 8-Kern-XU4), schätze ich Folgendes ein, um am effektivsten zu sein.

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

Der Befehl für eine Zeile, nach dem Sie gesucht haben: Der
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findBefehl stellt nur Dateien bereit,
die mit .ape enden. Der findBefehl gibt den relativen Pfad zum avconvBefehl an, damit diese Dateien konvertiert und im selben Ordner wie die Eingabedatei (dh .ape) gespeichert werden können.
findDer Befehl findet alle Dateien in diesem Verzeichnis, unabhängig davon, wie tief sie im Unterverzeichnis gespeichert sind

Edward Torvalds
quelle
2
Das wird nicht funktionieren; avconvIch kann keine Eingabedateien von STDIN so nehmen.
Evilsoup
1
Was ist mit dem Ausgabeordner?
Tigerjack89
@evilsoup Ich habe die Antwort aktualisiert, xargs kann das Problem lösen. Bitte versuchen Sie dies.
Edward Torvalds