GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

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

Linux
  1. Der beste Weg, Benutzer auf mehreren Servern zu verwalten?

  2. Wie kann ich Alias-Befehle mit xargs verwenden?

  3. Kann ich die Pipe-Ausgabe als Shell-Skript-Argument verwenden?

  4. Wie verwende ich das neueste Python 2.7.x auf Ubuntu 12.04 LTS richtig?

  5. Richtige Methode zur Verwendung von OnFailure in systemd

Schlängeln Sie sich durch Ihr Linux-Terminal

So verwenden Sie den Linux-xargs-Befehl

Docker:Wie man es praktisch nutzt - Teil 3

Weg zum Durchsuchen von Manpages für ein typisches Anwendungsszenario?

Rohr B nach D? – A &&B || C | D?

Wie verwende ich den xargs-Befehl unter Linux?