Gibt es eine Möglichkeit, Xargs über eine Pipe zu verwenden?

15

Ich versuche, flac-Dateien, die in einen Ordner verschoben wurden, automatisch in mp3 in einem anderen Ordner zu konvertieren.

Meine aktuelle Codezeile lautet:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test |  xargs -I x flac -cd x - | lame -b 320 - /media/1tb/x.mp3

Um zu erklären, wie dies bisher funktioniert, überwacht inotifywait ~ / test rekursiv auf dort verschobene Dateien und gibt den Pfad und den Dateinamen in einer Pipe aus. xargs übernimmt diesen Namen und erstellt den richtigen flac-Befehl, wobei x durch den Dateinamen ersetzt und die Datei in eine andere Pipe dekodiert wird. 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 greifen, das x im lame-Befehl ersetzen oder es auf irgendeine Weise an eine Variable senden, auf die beide Befehle zugreifen können, oder so. Ich habe versucht, mit Named Pipes und dem Jazz herumzuspielen, aber die Tatsache, dass tatsächlich Daten zwischen den beiden Befehlen übertragen werden, hat mich in die Irre geführt.

sagev9000
quelle

Antworten:

16

Wenn ich das richtig verstehe, möchten Sie eine Instanz flac … | lame …für jede Eingabezeile starten und die Eingabe in die Argumente für beide Befehle interpolieren.

Da Sie xargseine Pipeline starten müssen, müssen Sie dafür sorgen, dass sie ein Programm startet, das Pipelines erstellen kann, dh eine Shell.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "/media/1tb/$0.mp3"'

Alternativ kann die aufrufende Shell die Zeilen einzeln lesen und die Pipeline ausführen.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
  flac -cd "$file" - | lame -b 320 - "/media/1tb/$file.mp3"
done

Beachten Sie, dass das Format %w%feinen absoluten Pfad erzeugt, dem Sie voranstellen /media/1tbund anfügen .mp3. Wenn Sie den Verzeichnisteil der Datei im lameBefehl entfernen möchten , wechseln Sie $filezu ${file##*/}. Wenn Sie die Erweiterung entfernen möchten, wechseln Sie $filezu ${file%.*}. Wenn Sie beides tun möchten, müssen Sie zwei Schritte ausführen. Wenn Sie die Verzeichnishierarchie unter reproduzieren möchten /media/1tb, können Sie verwenden mkdir -p.

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 - "/media/1tb/$dir/${file#.*}.mp3"
done
Gilles 'SO - hör auf böse zu sein'
quelle
3

Sie könnten versuchen, etwas wie:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test \
    | while read x; do \
        flac -cd "$x" - | lame -b 320 - "/media/1tb/$x.mp3"
    done;
Goldlöckchen
quelle
1
while read …ist eine Lösung, aber dann fallen xargs. Was Sie geschrieben haben, ergibt einfach keinen Sinn: Woher kommt Ihrer Meinung xargsnach der Input? Und Sie sollten die Dinge richtig zitieren, es ist üblich, dass Musikdateinamen Leerzeichen enthalten.
Gilles 'SO- hör auf böse zu sein'
@ Gilles Es war / ist mir nicht klar, was das OP genau macht, weshalb ich sagte "Sie könnten so etwas versuchen " und "Ich bin mir nicht sicher, ob das xargs-Bit Ihren Absichten entspricht" usw Also nicht die beste Antwort, sondern ein Hinweis in die richtige Richtung, denke ich. Habe das Zitatproblem behoben und xargs entfernt.
Goldlöckchen