Schreiben Sie die dynamische Ausgabe des Terminals in eine Textdatei

Schreiben Sie die dynamische Ausgabe des Terminals in eine Textdatei

dynamic outputEs 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 playBefehl ist vonSoXSoftware.

Nun sieht die Ausgabe ungefähr so ​​aus:

Befehl „playRandom“

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 playBefehl nach dem Abspielen einer einzelnen Datei beendet wird, können wir statt der Verwendung xargsund Bereitstellung playeines 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'' -rBefehle 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.txtaufgeführt zu werden, ändern Sie den Befehl wie folgt:findfind

find ./ -type f -not -name "playlist.txt" -print0

Wenn wir zusätzlich sicherstellen möchten, dass nur .mp3Dateien 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 playentweder über xargsoder erneut über while IFS= read -r ; do ... donedie 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 playBefehl 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 readlinkerhalten wir den Dateinamen
  • durch die soxiwir die Informationen erhalten
  • Wir grepschneiden 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_namesin Ihrem aktuellen Verzeichnis erstellt, die alle Titelnamen enthält.

verwandte Informationen