Es kommt darauf an, den dynamic output
(ich erkläre) des Terminals in einer Textdatei zu speichern, aber hier ist, was ich letztendlich suche.
Ich habe einen benutzerdefinierten Befehl für das Terminal namens playRandom
erstellt. Er bewirkt, dass zufällige Songs für immer abgespielt werden. Die Bash-Datei, die ich dafür erstellt habe:
#!/bin/bash
find ./ -type f | sort -R | xargs -I + play +
Hinweis: Der Befehl play
stammt aus der Software SoX .
Jetzt sieht die Ausgabe ungefähr so aus:
Wie Sie sehen, ändert sich die Ausgabe dynamically
, daher kann ich >>
nicht zum Speichern der Ausgabe verwenden.
Ich möchte in der Lage sein, "Namen von Songs, die abgespielt werden" in einer Textdatei zu speichern.
Wie kann ich dieses Ziel erreichen? Danke im Voraus.
Da der Befehl play
nach dem Abspielen einer einzelnen Datei beendet wird, können wir xargs
nicht verwenden und play
eine Reihe von Dateien geben, sondern jede Datei einzeln nacheinander entfernen eine Zeit, und geben Sie es in die Datei und spielen Sie die Datei danach. Das bearbeitete Skript würde wie folgt aussehen. Beachten Sie, dass hier zusätzliche Optionen und der Befehl IFS= read -d'' -r
hinzugefügt werden, um mit Dateinamen auf sichere Weise umzugehen.
#!/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 die Datei playlist.txt aufgenommen werden, sodass wir die Ausgabe des Skripts in Echtzeit mit etwas wie tail -F playlist.txt
verfolgen können.
NOTE: um zu vermeiden, dass playlist.txt
in find
s Ausgabeänderung find
aufgeführt wird, wie folgt:
find ./ -type f -not -name "playlist.txt" -print0
Wenn wir außerdem sicherstellen möchten, dass nur .mp3
-Dateien aufgelistet sind, können wir dies tun:
find ./ -type f \( -not -name "playlist.txt" -and -name "*.mp3" \) -print0
Wenn es unser Ziel ist, die Dateiliste zu sichern, bevor sie abgespielt wird , steckt nicht viel Wissenschaft dahinter - die Find-Sort-Pipeline kann beschrieben werden Datei zuerst, und diese Datei kann dann play
entweder über xargs
oder erneut über while IFS= read -r ; do ... done
Struktur zugeführt 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
find ./ -type f | sort -R | tee text.file | xargs -I + play +
Siehe auch man tee
.
Hier ist meine Lösung:
Nachdem Sie den Befehl play
ausgeführt haben, verwenden Sie diesen Befehl:
soxi "$(readlink /proc/`pidof play`/fd/3)" | grep -Po "(?<=Title=).*"
Es wird der Name des aktuell wiedergegebenen Songs für Sie zurückgegeben und Sie können ihn mit >
in eine Datei umleiten.
/proc/`pidof play`/fd/3
readlink
erhalten wir den Dateinamensoxi
erhalten wir seine Informationengrep
schneiden wir den Titeltitel ausfind ./ -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 Spurnamen enthält.