Ich versuche, FLAC-Dateien, die in einen Ordner verschoben wurden, automatisch in MP3 in einem anderen Ordner zu konvertieren.
Meine aktuelle Codezeile ist diese:
inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test | xargs -I x flac -cd x - | lame -b 320 - //eadn-wc01-5196795.nxedge.io/media/1tb/x.mp3
Um zu erklären, wie das bisher funktioniert, überwacht inotifywait ~/test rekursiv auf dorthin verschobene Dateien und gibt den Pfad und den Dateinamen an eine Pipe aus. xargs nimmt diesen Namen und erstellt den richtigen flac-Befehl, ersetzt x durch den Dateinamen und dekodiert die Datei in eine andere Pipe. In der neuen Pipe verarbeitet lame die Ausgabe von flac in mp3 unter /media. Ich möchte, dass xargs entweder auf irgendeine Weise über die Pipe reichen, das x im lahmen Befehl ersetzen oder es auf irgendeine Weise an eine Variable senden, auf die beide Befehle zugreifen können, oder so etwas. Ich habe versucht, mit benannten Pipes und diesem Jazz herumzuspielen, aber die Tatsache, dass tatsächlich Daten zwischen den beiden Befehlen geleitet werden, hat mich überfordert.
Akzeptierte Antwort:
Wenn ich das richtig verstehe, möchten Sie eine Instanz flac … | lame …
für jede Eingabezeile und interpolieren Sie die Eingabe in die Argumente für beide Befehle.
Da braucht man xargs
Um eine Pipeline zu starten, müssen Sie sie dazu bringen, ein Programm zu starten, das in der Lage ist, Pipelines zu erstellen, d. h. eine Shell.
inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$0.mp3"'
Alternativ können Sie die aufrufende Shell Zeilen nacheinander lesen und die Pipeline ausführen lassen.
inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
flac -cd "$file" - | lame -b 320 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$file.mp3"
done
Beachten Sie, dass das Format %w%f
erzeugt einen absoluten Pfad, dem Sie /media/1tb
voranstellen und .mp3
anhängen . Wenn Sie den Verzeichnisteil der Datei in der Datei lame
entfernen möchten Befehl, ändern Sie $file
zu ${file##*/}
. Wenn Sie die Erweiterung entfernen möchten, ändern Sie $file
zu ${file%.*}
. Wenn Sie beides tun möchten, müssen Sie es in zwei Schritten tun. Wenn Sie die Verzeichnishierarchie unter /media/1tb
nachbilden möchten , können Sie mkdir -p
verwenden .
cd ~/test
inotifywait -m -r -q -e moved_to --format "%w%f" . |
while IFS= read -r file; do
[ -f "$file" ] || continue; # skip directories and other special files
dir=${file%/*}; file=${file##*/}
mkdir -p "/media/1tb/$dir"
flac -cd "$dir/$file" - | lame -b 320 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$dir/${file#.*}.mp3"
done