dynamic output
Es läuft darauf hinaus, das Terminal in einer Textdatei speichern zu können (ich werde es erklären), aber hier ist, was ich letztendlich suche.
Ich habe einen benutzerdefinierten Befehl für das Terminal namens erstellt playRandom
. Er spielt endlos zufällige Songs ab. Die Bash-Datei, die ich dafür erstellt habe:
#!/bin/bash
find ./ -type f | sort -R | xargs -I + play +
Hinweis: Der play
Befehl ist vonSoXSoftware.
Nun sieht die Ausgabe ungefähr so aus:
Wie Sie sehen, ändert sich die Ausgabe dynamically
, sodass ich >>
sie nicht speichern kann.
Ich möchte die Namen der abgespielten Songs in einer Textdatei speichern können.
Wie kann ich dieses Ziel erreichen? Vielen Dank im Voraus.
Antwort1
Speichern der Dateinamen, die aktuell abgespielt werden
Da der play
Befehl nach dem Abspielen einer einzelnen Datei beendet wird, können wir statt der Verwendung xargs
und Bereitstellung play
eines Stapels von Dateien jede Datei einzeln herausnehmen, in eine Datei zurückgeben und die Datei anschließend abspielen. Das bearbeitete Skript würde wie folgt aussehen. Beachten Sie, dass hier zusätzliche Optionen und IFS= read -d'' -r
Befehle hinzugefügt wurden, um Dateinamen auf sichere Weise zu verarbeiten.
#!/bin/bash
# create file for playing songs first
echo > playlist.txt
# Now play each song and echo filename to file
find ./ -type f -print0 | sort -z -R | while IFS= read -d '' -r filename
do
clear
echo "$filename" >> playlist.txt
play "$filename"
done
Der Vorteil dieses Ansatzes besteht darin, dass die Dateinamen beim Abspielen in playlist.txt eingetragen werden, was es uns ermöglicht, die Ausgabe des Skripts in Echtzeit mit etwas wie zu verfolgen tail -F playlist.txt
.
NOTIZ: Um zu vermeiden, in der Ausgabe playlist.txt
aufgeführt zu werden, ändern Sie den Befehl wie folgt:find
find
find ./ -type f -not -name "playlist.txt" -print0
Wenn wir zusätzlich sicherstellen möchten, dass nur .mp3
Dateien aufgelistet werden, können wir Folgendes tun:
find ./ -type f \( -not -name "playlist.txt" -and -name "*.mp3" \) -print0
Liste der gefundenen Dateien zur Wiedergabe speichern
Wenn unser Ziel darin besteht, die Dateiliste zu speichernVores wird gespielt, es gibt nicht viel Wissenschaft dahinter - die Find-Sort-Pipeline kann zuerst in eine Datei geschrieben werden, und diese Datei kann dann play
entweder über xargs
oder erneut über while IFS= read -r ; do ... done
die Struktur weitergeleitet werden
#!/bin/bash
find ./ -type f -print0 | sort -z -R > playlist.txt
while IFS= read -d '' -r filename
do
clear
play "$filename"
done < playlist.txt
Antwort2
find ./ -type f | sort -R | tee text.file | xargs -I + play +
Siehe auch man tee
.
Antwort3
Hier ist meine Lösung:
1. Echtzeit (Aktuell abgespielt)
Nachdem Sie den play
Befehl ausgeführt haben, verwenden Sie Folgendes:
soxi "$(readlink /proc/`pidof play`/fd/3)" | grep -Po "(?<=Title=).*"
Es gibt Ihnen den Namen des aktuell abgespielten Songs zurück und Sie können ihn mithilfe von in eine Datei umleiten >
.
1.1. Hinweise
/proc/`pidof play`/fd/3
- ist der Dateideskriptor für Ihren aktuell wiedergegebenen Titel (Datei).
- Mit
readlink
erhalten wir den Dateinamen - durch die
soxi
wir die Informationen erhalten - Wir
grep
schneiden den Titel des Stücks
2. Vor dem Spielen (Alle Namen auflisten)
find ./ -type f | sort -R | tee /tmp/play-files | xargs -I + soxi "+"\
| grep -Po "(?<=Title=).*" > list_of_names && xargs < /tmp/play-files\
-I + play "+"
Es wird eine Datei mit dem Namen list_of_names
in Ihrem aktuellen Verzeichnis erstellt, die alle Titelnamen enthält.