[gelöst] Bash-Skript programmieren für mp3-Wiedergabe - Alternative zu 1by1

German Forum

Moderator: karlchen

Post Reply
dratoel
Level 1
Level 1
Posts: 3
Joined: Thu Jul 26, 2018 1:56 pm

[gelöst] Bash-Skript programmieren für mp3-Wiedergabe - Alternative zu 1by1

Post by dratoel » Thu Jul 26, 2018 2:39 pm

ich bin Windows-Umsteiger, habe vor Jahren Pascal programmiert und versuche jetzt mein erstes Skript in der Bash zu schreiben.
Ich möchte eine bestehende sortierte Textdatei (z.B. eine Liste meiner Musikdateien) so kürzen, dass in ihr nur noch die Zeilen stehen, die nach dem Auffinden eines Suchstrings in der Datei sind; außerdem muss die Zeile, in der der Suchstring steht, erhalten bleiben. Der Suchstring muss eine Variable sein.
Ein Beispiel, was ich meine:

So könnte der Ursprungsinhalt der Datei aussehen:
  • ---Datei Beispiel:---
    004.mp3
    005.mp3
    006.mp3
    007.mp3
    ---Datei Ende---
Wenn ich jetzt $SUCHSTRING=006.mp3 definiere, soll die Datei so aussehen:
  • ---Datei Ergebnis:---
    006.mp3
    007.mp3
    ---Datei Ende---

Ich habe versucht, mit while oder for-Schleifen und head und tail zum Ziel zu kommen; danach habe ich probiert, dies mit sed zu erreichen. sed löscht den Suchstringtreffer immer mit. Und bei awk hab ich dann kapituliert. Ich kriegs nicht hin. Ich habe per Google gesucht; hier im (deutschen) Forum bin ich auch auf kein Thema gestoßen, das passt.
Ich möchte damit einfach in Nemo über Doppelklick und mpg321 meine mp3-Dateien abspielen, ohne dass ein für Linux verfügbarer Player eine Datenbank erstellt und ich immer in die Sammlung klicken muss.
Ich hoffe, ich habe mich verständlich ausgedrückt. Es tut mir leid, wenn ich Begriffe falsch verwende.
Jede Hilfe ist mir willkommen.
Last edited by dratoel on Sat Jul 28, 2018 3:03 am, edited 5 times in total.
OS: Linux Mint Tara --- Edition: Cinnamon x64 --- System: i5

User avatar
xenopeek
Level 24
Level 24
Posts: 23117
Joined: Wed Jul 06, 2011 3:58 am
Location: The Netherlands

Re: Bash-Skript programmieren mit sed

Post by xenopeek » Thu Jul 26, 2018 4:33 pm

Eine Alternative ist die Verwendung von grep. Angenommen, Ihre Datei heißt "input.txt" und die Ergebnisse werden in "output.txt" gespeichert. Wenn Sie viele Dateien konvertieren müssen, können Sie ein einfaches Bash-Skript mit einer Schleife erstellen.

grep --color=never -m 1 -A "$(cat input.txt | wc -l)" "006.mp3" input.txt > output.txt

Im Grunde geben wir grep an, nur die erste übereinstimmende Zeile in der Datei input.txt zu finden, sie und alle darauffolgenden Zeilen zu drucken (indem die Gesamtzahl der Zeilen in der Datei übergeben wird), keine Farben zu verwenden und die Ergebnisse zu speichern zu output.txt.

(In Englisch) Die Linie wird im Detail erklärt: https://explainshell.com/explain?cmd=gr ... output.txt

Ich will dich nicht daran hindern, Bash zu lernen, aber bedenke, dass du auch in Pascal unter Linux programmieren kannst! Free Pascal Compiler Informationen hier: https://www.freepascal.org/. Sie können es auf Linux Mint über das Paket "fpc" installieren. Sie können das Paket "lazarus-ide" hinzufügen, um die IDE für Free Pascal zu erhalten.
Image

dratoel
Level 1
Level 1
Posts: 3
Joined: Thu Jul 26, 2018 1:56 pm

Re: Bash-Skript programmieren mit sed

Post by dratoel » Fri Jul 27, 2018 2:59 pm

Ich freu mich wie ein Schnitzel! Eigentlich wollte ich das laut rausschreien, aber ich will auch keinen Ärger.

Die grep-Befehlszeile von xenopeek funktioniert ein-wand-frei! Ich habe tagelag rumprobiert, das Projekt zweimal wieder beerdigt und dann doch wieder vorgekramt, und hier stellt man es ein, wartet keine drei Stunden (!), und erhält Lösung, Erklärung, die Weblinks dazu und alles.... unglaublich. Dank an xenopeek.

Ich möchte jetzt das "Ergebnis" dieser einen Zeile Code präsentieren:

Ich habe mit eine (seeehr einfache) Alternative zum Windows-Programm 1by1 als Bash-Skript gebaut, die einfach, wenn man eine mp3-Datei doppelt anklickt, diese Datei und alle in dem Ordner folgenden mp3-Dateien abspielt. Man kann da bestimmt noch viel "tunen" (Titelanzeige, shuffle und repeat, Fortschrittsbalken etc.pp.), aber es tut jetzt mal, was es soll.

Folgendes Vorgehen:
  • Man benötigt aus der Anwendungsverwaltung von Mint das Programm MPG321, welches einfach auf der Konsole mp3-Dateien abspielen kann (und viel mehr). Einfach in der Anwendungsverwaltung in das Suchfeld tippen und installieren.
  • Dann das hier anschließende Listing als mp3play.sh in einem persönlichen Ordner speichern und die Datei als ausführbar markieren.
  • Dann zuerst einen neuen Starter auf dem Schreibtisch oder in der Leiste anlegen und dort diese mp3play.sh als Programm aufrufbar machen. Das ist deshalb wichtig, weil man später die mp3-Wiedergabe nur noch mit diesem Starteraufruf oder dem erneuten Start des Skripts stoppen kann.
  • Jetzt kommt es: man suche sich eine beliebige mp3-Datei, mit der rechten Maustaste anklicken und den Dialog "Öffnen mit - Andere Anwendung..." aufrufen. Ganz unten in diesem Dialog unter "Sie könne auch einen eigenen Befehl..." die mp3play.sh mit Pfad eingeben - oder besser hinten mit dem Ordnerknopf dies hinterlegen. Jetzt ist der Knopf "Zur Liste hinzufügen" nicht mehr grau - anklicken. Und dann noch den Knopf "Als Vorgabe festlegen" anklicken.
Ich höre grade ziemlich laut wieder meine alte Musik - kennt hier jemand J.B.O.?
Last edited by dratoel on Sat Jul 28, 2018 2:59 am, edited 2 times in total.
OS: Linux Mint Tara --- Edition: Cinnamon x64 --- System: i5

dratoel
Level 1
Level 1
Posts: 3
Joined: Thu Jul 26, 2018 1:56 pm

Re: Bash-Skript programmieren mit sed

Post by dratoel » Fri Jul 27, 2018 3:00 pm

#!/bin/bash
# Andere Instanzen des Musikplayers beenden
killall -q mpg321

# Ohne Kommandozeilenparameter hier Ende
if ["$1" == ""]; then exit 0; fi

# Verzeichnispfad der übergebenen/aufrufenden Datei
PFAD=$1
PFAD=${PFAD%/*}

# Name der übergebenen/aufrufenden Datei
NAME=$1
NAME=${NAME##*/}

# Wechsle zum Verzeichnispfad
cd "$PFAD"

# Erzeuge mp3-Dateienliste
ls -1 *.mp3 >.mp3play1.txt

# Kürze Liste um vorhergehende Dateien --> Dank an xenopeek
grep --color=never -m 1 -A "$(cat .mp3play1.txt | wc -l)" "$NAME" .mp3play1.txt > .mp3play2.txt

# Spiele Liste im Musikplayer
mpg321 -q -@ .mp3play2.txt

# Lösche Listen
rm -f .mp3play1.txt
rm -f .mp3play2.txt

# Ende
exit 0
Last edited by dratoel on Fri Jul 27, 2018 4:37 pm, edited 4 times in total.
OS: Linux Mint Tara --- Edition: Cinnamon x64 --- System: i5

User avatar
xenopeek
Level 24
Level 24
Posts: 23117
Joined: Wed Jul 06, 2011 3:58 am
Location: The Netherlands

Re: Bash-Skript programmieren mit sed

Post by xenopeek » Fri Jul 27, 2018 3:57 pm

Gern geschehen!

Viel Spaß mit Bash-Skripten :-)
Image

Post Reply

Return to “Deutsch (German)”