Skript um verwaiste .bif Dateien zu finden

  • Hallo,

    ich versuche, ein Skript mit Hilfe von Chat GPT und Google zu schreiben, dass mir vewaiste .bif Dateien findet.

    Das sind Reste von Emby, die übrig bleiben wenn man eine dazugehörige Aufnahme löscht.

    Emby erzeugt immer eine gleichlautende Datei, hängt noch ein " -320-10" an, und die Endung .bif.

    So wird aus "Aufnahme.ts" dann "Aufnahme -320-10.bif"

    Die Aufgabe klingt einfach, nämlich "Erstelle ein Unraid Skript, das alle .bif Dateien in einem Verzeichnis sucht. Entferne dann die letzen 8 Zeichen aus dem Dateinamen. Suche weitere Dateien, mit dem gleichen Dateinamen, aber der Endung .ts. Gibt es den Dateinamen nicht, gibt den ursprünglichen Dateinamen mit der .bif Endung aus."

    Leider funktioniert es nicht wie ich es mir dachte, es gibt trotz zig Versuchen immer nur Variationen von:

    Bash
    #!/bin/bash
    for file in *.bif; do
        filename="${file%.*}"    
        if [ ! -f "${filename::-8}.ts" ]; then        
            echo "$file"    
        fi
    done

    Ich kenne die Syntax zu wenig und breche mir grad die Hirnwindungen.

    Aber vom Ergebnis her scheint es genau umgekehrt wie es sein soll, es listet alles auf was .bif UND .ts hat.

    Verstehe ich da was falsch, oder wo ist noch ein Denkansatz?

    Danke euch!

  • mein kleines Gespräch mit Chatgpt ergab folgendes:

  • Commerzpunk, ich habe noch nach einer Alternative gefragt, dort wird mit cut gearbeitet.

    --------------
    Guides nicht mehr verfügbar wegen Youtube unvermögen guten von schlechten Kodi Videos zu unterscheiden.

  • Und hier eine Version mit sed und regex, ich denke die ist schöner.

    --------------
    Guides nicht mehr verfügbar wegen Youtube unvermögen guten von schlechten Kodi Videos zu unterscheiden.

  • Ok, lustig, den cut Befehlt hatte ich nun auch in meinen Vorschlägen.

    Offenbar muss man da aber incl. der Dateiendung rechnen (13 statt 9), sonst hängt immer noch ein "-32" mit dran.

    Leider funktioniert das trotzdem nicht:

    Ergebnis:

    Best of the Taste – Süße Sünde -320-10.bif

    Best of the Taste – Süße Sünde.ts

    Problem: die Dateien sind aber beide da (vor allem die .ts natürlich).

    Irgendwie schnalle ich das nicht.

  • AHHHHHH!

    Jetzt.

    Oben bleibt mal alles so stehen, gibt ja was zu lernen.

    Ich habe eine Grundregel nicht beachten, nämlich ganz genau zu gucken und zu zählen und haarklein zu vergleichen.

    TVHeadend schmuggelt noch ein Leerzeichen zwischen Dateiname und Endung, was man aber in der Krusader Darstellung zu leicht übersehen kann.

    Nu isses fein, Danke an Chat GPT und SkyBird1980!

  • Finales Skript, also Beta, bis ich mich traue den Löschbefehl aktiv zu setzen :)

  • Das funktioniert so nicht.

    Ich würde hier erstmal kein "rm" ausführen. Es wird Dateien löschen, auch wenn es keine passende *.ts-Dateien gibt.

    Gründe:

    for i in *.bif; do <- das kann man so machen. Ich würde aber eher mit einem find arbeiten.

    base=$(echo "$file" | rev | cut -c 12- | rev)

    Wenn wir diese Zeile auf den Dateinamen: Best of the Taste – Süße Sünde -320-10.bif anwenden, dann kommt bei echo "$base.ts" folgendes raus:

    Best of the Taste – Süße Sünde .ts achte bitte auf das Leerzeichen vor dem Punkt...das wird zu Fehlern führen.

    Edit:

    Diese Zeile:

    if [ ! -f "$base.ts" ]; then

    Tut nicht das, was du denkst, was sie tut.

    Diese Zeile überprüft zwar ob ein Dateinamen mit der Endung da ist...da du aber ein Leerzeichen im "$base" hast wird die Struktur auch dann betreten, wenn die Datei existiert. Nur existiert sie wahrschienlich so:

    Best of the Taste – Süße Sünde.ts

    und dein Script sucht aber nach:

    Best of the Taste – Süße Sünde .ts

    Weiter negierst du die Aussage mit einem "!". Wenn es also eine Datei gibt, die so heißt, wie du es erwarten würdest, dann wird die Struktur nicht betreten.

    Dröseln wir das mal auf und nehmen auch mal an, dass "$base" so auflöst Best of the Taste – Süße Sünde.ts

    Diese Zeile...

    if [ ! -f "$base.ts" ]; then


    prüft bei [ -f "$base.ts" ob die Datei existiert und ob es eine "reguläre" Datei ist. Sollte die Datei wirklich existieren, dann würde die genannte Zeile ein "true" zurück geben und du würdest die if-Struktur betreten und du würdest auch dann innerhalb der Struktur deine *.bif-Datei löschen. Du hast aber die Aussage negiert. Mit einem ! am Anfang. Somit wird aus dem vermeintlichen "true" ein "false" und du betrittst die Struktur nicht. Somit werden einfach beide Dateien bestehen bleiben, wenn sie existieren.

    Deine Aufgaben:

    • base=$(echo "$file" | rev | cut -c 12- | rev) anpassen, damit das Leerzeichen verschwindet.
    • for i in *.bif; do hierfür eher ein "find" verwenden, damit du den vollen Pfad zum Dateinamen bekommst und du es auch außerhalb des Ordners verwenden kannst.

    Das Script würde ich so nicht ausführen. Leider ist da ChatGPT nicht immer eine Hilfe

  • du kannst das auch mal so auf der Kommandozeile nach und nach prüfen:

    echo "Best of the Taste – Süße Sünde -320-10.bif" | rev

    Das dreht das "echo" um gibt es rückwärst aus:

    fib.01-023- ednüS eßüS – etsaT eht fo tseB

    echo "Best of the Taste – Süße Sünde -320-10.bif" | rev | cut -c 12-

    Schneidet von "character 12" bis zum Ende alles ab...es gibt folgendes aus:

     ednüS eßüS – etsaT eht fo tseB

    Und hier hast du am Anfang schon das Leerzeichen drin

    Wenn du dir also sicher bist, dass es immer folgende Struktur hat:

    "Dateiname"+"Leerzeichen"+"11 Zeichen" Dann kannst du wie folgt vorgehen:

    echo "Best of the Taste – Süße Sünde -320-10.bif" | rev | cut -c 13- | rev

    Dann wird das letzte Leerzeichen mit weg geschnitten.

    Solltest du dir da nicht sicher sein, dann würde ich das Script nicht anwenden, wenn du keinen Datenverlust haben möchtest oder mehrere [tt]if[/tt-Kontrollstrukturen anwenden. So würde ich dich auf meinem Server nicht mit dem Script arbeiten lassen. Sorry.

    Edit:

    Ich habe dein Script mal ein wenig angepasst:

    Das ganze sieht dann bei mir so aus:

    Im oberen Bereich siehst du, dass beide Dateinamen vorhanden sind. Im unteren Bereich siehst du die Ausgabe des Scripts.

    Es gibt auch eine bif-Datei, die noch keine passende ts-Datei hat. Das gibt das Script auch aus.

    Nett gemeinter Ratschlag:

    Lasst euch von ChatGPT keine Scripte schreiben, wenn ihr sie nicht versteht und dabei potentiell Daten verloren gehen können

    Einmal editiert, zuletzt von DaVu (21. Mai 2023 um 11:24)

  • Lasst euch von ChatGPT keine Scripte schreiben, wenn ihr sie nicht versteht und dabei potentiell Daten verloren gehen können

    Das ist immer ein guter Tipp, und besserer Tipp ist halt die Scripte zu testen und die "bösen" Befehle auszukommentieren.

    --------------
    Guides nicht mehr verfügbar wegen Youtube unvermögen guten von schlechten Kodi Videos zu unterscheiden.

  • @DaVu Vielen Dank für dein sehr detailliertes durchgehen und erklären, das hilft mir schon dabei die Linux Befehle besser zu verstehen, danke!

    Anmerkungen und Fragen: ;)

    1. Es sind blöde Vorschaudateien von Emby, also ganz real erst mal nix kritisches. Emby würde die sogar neu aufbauen, wenn ich sie fälschlich lösche. :)

    2. Zu dem Tipp mit dem vorsichtig sein und böse Befehle auskommentieren, hab ich genau so gemacht.

    3. Zu dem Tipp mit ChatGPT und "wenn man keine Ahnung hat" - ich nutze das als Lernhilfe und komme mit der Art viel besser klar als alles zusammen zu suchen, vor allem weil ich wenig Ahnung habe. Allerdings gehe ich das so gut ich kann durch und wenn mir etwas falsch erscheint suche ich weiter oder frage hier - also der Grund für den Thread hier. :)

    4. Kann es sein, dass du meine Anforderung aber trotzdem genau umgedreht hast? Ich möchte doch die bif Dateien loswerden zu denen es keine .ts Datei mehr gibt, weil Aufnahme gelöscht.

  • Kann es sein, dass du meine Anforderung aber trotzdem genau umgedreht hast? Ich möchte doch die bif Dateien loswerden zu denen es keine .ts Datei mehr gibt, weil Aufnahme gelöscht.

    Ahhh...Ich dachte es wäre genau anders herum.

    er möchte nur löschen wenn nicht eine .ts auch schon existiert

    Nach dieser Aussage verstehe ich es so, dass du nur dann löschen möchtest WENN eine ts-Datei existiert.

    Ich versuche es aber nochmal zusammen zu fassen:

    • Wenn eine bif-Datei UND eine passende ts-Datei existiert
      • dann NICHTS löschen
    • Wenn eine bif-Datei aber KEINE ts-Datei existiert
      • dann bif-Datei löschen

    Ist das dann jetzt so richtig? Wenn ja, dann stimmt das Script oben so natürlich nicht. Ich würde erstmal die Antwort abwarten und kann dir dann Vorschläge zum Script machen. Im Endeffekt müsstest du den "rm"-Befehl nur in den "else" Bereich schieben und wärst erstmal fertig.

    Aber du hast, wie gesagt, noch andere Baustellen im Script. Ich denke dabei an sowas

    • im rm-Befehl sollten volle Pfade (von der Wurzel bis zur Datei) angegeben werden um sich sicher zu sein, dass es auch die richtigen Dateien sind
    • das script sollte von überall aus ausgeführt werden können. Ggf., wenn man einen bestimmten Pfad möchte, dann sollte es einen entsprechenden Parameter geben, über den du den Pfad mit angeben kannst und der dann im Script berücksichtigt wird
    • Um nach den richtigen Dateien zu suchen, solltest du auf Leerzeichen achten. Da bedarf es noch einiger Checks. Je nachdem, wie deine Dateien aufgebaut sind. Ich sehe, dass du Dateinamen mit Leerzeichen darin verwendest. Das bringt unter Linux immer Probleme mit sich, wie du oben schon sehen kannst. Ist ja nicht so, als hätte ich das hier nicht schon wie ein Pfarrer gepredigt, dass das ne schlechte Idee ist ;) (kein Fingerpointing und kein bashing....einfach leider nur die Wahrheit ;) ).
    • "find" kannst du leider nicht verwenden, da du Leerzeichen in Dateinamen hast. Das habe ich gerade versucht und das endet ganz ganz bose. Du hast aber das Problem, dass dein Script so wie es jetzt ist, nicht rekursiv arbeitet. Dafür kann man sich mal das hier anschauen. https://stackoverflow.com/questions/9612…eturned-by-find

    Hier nur mal das Beispiel damit du siehst, warum Leerzeichen und "find" doch keine gute Idee ist:

    Ich würde dein Script dann also so abändern: for i in **/*.bin; do. Dann wäre es wenigstens rekursiv und es werden auch die vollen Pfade vom Ausgangspunkt des Script-Aufrufs aus angegeben. Wenn du die vollen Pfade von der Wurzel her haben möchtest, dann machst du es so: for i in /**/*.bif; do

  • Nach dieser Aussage verstehe ich es so, dass du nur dann löschen möchtest WENN eine ts-Datei existiert.

    Richtig zitiert aber falsch verstanden. Das "nicht" ist entscheidend.

    --------------
    Guides nicht mehr verfügbar wegen Youtube unvermögen guten von schlechten Kodi Videos zu unterscheiden.

  • @DaVu Ja, es ist so wie du schreibst.

    Im Grunde wirklich einfach: Wenn ich Aufnahmen lösche, bleiben die Vorschaudateien von Emby zurück, weil tvh die nicht kennt, oder ich zu faul bin das alles von Hand zu bereinigen.

    Also sollen, wie im Titel beschrieben, die verwaisten .bif weg, zu denen es keine .ts Entsprechung gibt.

    An dem Leerzeichen am Ende würde ich mich mal nicht aufhängen, das spielt einfach keine Rolle. Wenn tvh das Leerzeichen anhängt, wird auch Emby das "320-10" an das Leerzeichen anfügen.

    Kann ich mir aber genauer angucken, das hab ich schon in Griff, mit Dateimustern und Massenumbenennungen kenn ich mich aus. :)

    Bzgl. der anderen Leerzeichen, naja, da bin ich mal frech und würde Linux einfach empfehlen mal kurz auf den Kalender zu gucken, bei mir steht das 2023 und ich ich glaub die Zeiten dass man Dateinamen mit Bindestrichen und Unterstrichen unleserlich und sehr schwer auswertbar macht, weil - und _ ja durchaus reguläre Zeichen sind die auch so mal vorkommen, sind vorbei.

  • An dem Leerzeichen am Ende würde ich mich mal nicht aufhängen, das spielt einfach keine Rolle. Wenn tvh das Leerzeichen anhängt, wird auch Emby das "320-10" an das Leerzeichen anfügen.

    Ok...da kenne ich Emby nicht gut genug. Ich verfolge nur die Beispiele, die du uns gibst und die wir auch an deinen Screenshots sehen. Wenn Emby nur 320-10 anhängen würde, dann wäre nach dem Beispiel hier

    Best of the Taste – Süße Sünde -320-10.bif

    der eigentliche Dateiname an den Emby was anhängen würde Best of the Taste – Süße Sünde -.ts und nicht Best of the Taste – Süße Sünde.ts. Denn dann würde  - irgendwie fehlen (Leerzeichen und ein Minus).

    Wenn du eine falsche Anzahl Zeichen abschneidest, die echte Datei am Ende vor dem Punkt kein Leerzeichen aufweist, du aber nach einer Datei mit einem Leerzeichen suchst, dann wird dein Script eklatant fehl schlagen und potentiell Dateien löschen, die du gar nicht löschen möchtest. Das mag für diese bif-Dateien kein Problem darstellen. Ich finde aber, dass du das wissen solltest, wenn du solche Operationen mal eigenständig auf andere (potentiell wichtige) Dateien ausweitest.

    Aber ich sehe ein, dass du deine Dateien besser kennst als ich :D und wie du dir erstmal anzeigen lässt welche Dateien gelöscht werden bevor es tatsächlich der Fall ist, weißt du ja [ay]. Ich würde dich nur gern sensibilisieren, warum vielleicht eine if-Struktur nicht betreten wird obwohl du es eigentlich erwarten würdest. Hilft halt bei der Fehlersuche oder unerwartetem Verhalten in Skripten ;)

    Bzgl. der anderen Leerzeichen, naja, da bin ich mal frech und würde Linux einfach empfehlen mal kurz auf den Kalender zu gucken, bei mir steht das 2023 und ich ich glaub die Zeiten dass man Dateinamen mit Bindestrichen und Unterstrichen unleserlich und sehr schwer auswertbar macht, weil - und _ ja durchaus reguläre Zeichen sind die auch so mal vorkommen, sind vorbei.

    Dateinamen mit Binde- und Unterstrichen im Namen sind von Bash als Scriptsprache wesentlich leichter auszuwerten als solche mit Leerzeichen. Da hast du wohl irgendwas missverstanden. Leerzeichen in Dateinamen werden von der Bash als einzelne Argumente interpretiert (sofern die Zeichen nicht Escaped werden). Weiter geht es dabei auch nicht um "Linux" als solches sondern um den Fakt, dass du eine Script-Sprache wie die Bash verwendest. Das hat erstmal nichts mit Linux als solches zu tun. Du kannst das ganze unter Linux auch in C++ oder in Python schreiben und schon wird das entsprechende Verhalten ein anderes sein. Mit einem Shell-Script verwendest du halt im Endeffekt die Kommandozeile und darin halt die Bash. Du kannst auch ksh, zsh oder csh verwenden und ggf. verhält es sich wieder anders. Du gibst halt mit #!/bin/bash den "Interpreter" vor.

    Wenn du dich also der Bash-Welt mit ihren Vor- und Nachteilen hingeben möchtest, dann musst du auch nach dessen Regeln spielen und wenn du das nicht tust, dann ist auf jeden Fall schon mal nicht Linux schuld ;)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!