web-dev-qa-db-de.com

Schreiben Sie die dynamische Ausgabe des Terminals in eine Textdatei

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:

playRandom command

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.

4
deergadan

Speichern von Dateinamen, die gerade abgespielt werden

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 finds 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

Speichern der Liste der gefundenen Dateien, die abgespielt werden sollen

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
10
find ./ -type f | sort -R | tee text.file | xargs -I + play +  

Siehe auch man tee.

8
waltinator

Hier ist meine Lösung:

1. Echtzeit (spielt gerade)

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.

1.1. Anmerkungen

/proc/`pidof play`/fd/3
  • ist der Dateideskriptor für den aktuell wiedergegebenen Titel (die aktuell wiedergegebene Datei).
  • mit readlink erhalten wir den Dateinamen
  • mit soxi erhalten wir seine Informationen
  • mit grep schneiden wir den Titeltitel aus

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 Spurnamen enthält.

3
Ravexina