Unter Ubuntu Filme in gleichnamige Ordner verschieben

  • ich habe hier sehr viele Filme die ich bisher in einem einzigen Ordner gespeichert hatte.

    Nun möchte ich das ganze etwas ordnen und neu aufbauen und will alle Filme in einen extra Unterordner haben.

    Gibt es für Ubuntu (liebend gerne auch im Terminal)
    einen entsprechenden Befehl oder Script)
    wo bei einem Film (zB. Teminator (1984).avi) den gleichnamigen Ordner erstellt und diese Datei dann in diesen Ordner verschiebt?

    also dasErgebnis sollte dann so aussehen: zB. /home/user/server/kodi/Filme/Terminator (1984)/Terminator (1984).avi

    Quelle wäre /home/user/server/kodi/Movies (dort sind alle Filme derzeit gespeichert

    H96max x3 32/4GB 64GB Sandisk U3
    CoreElec 19.2 Matrix

    X96mini S905W 16/2GB 32GB Sandisk U3
    CoreElec 19.2 Matrix

  • Vorsicht, die Vorschläge bei Stackoverflow sind etwas gefährlich.

    @Metallica, kannst du ausschließen, dass Punkte (außer .avi) im Dateinamen vorkommen?
    Hast du nur die .avi Dateien, oder evt. noch andere Dateien wie filmname.nfo die mit verschoben werden sollten?

    Was sich soo einfach anhört ist leider oft nicht so trivial, wenn man Sonderzeichen, mehrere Extensions, ... hat. Evt. noch Fehler abfangen (weil zufällig eine Datei herumliegt, die Filmname ohne Extension heißt, und damit das Anlegen des Verzeichnisses schief geht. Erfolg des Anlegens wird in den Beispielen nicht geprüft ...)

    Kodi 21.0, 17.6, 20.5, 16, 20.5 on Windows 11 Pro, Android 6, Android 12, FireTV Box 2nd Gen, FireTV 4k Max 2nd Gen
    Media on NAS, OpenMediaVault 6 (Debian Linux).

  • Der MediaElch soll das beherrschen.
    Aus Erfahrung weiß ich das das Program Ordner und Files in eine Kodi konforme Struktur pressen kann. Und laut Dokumentation auch einzelne Files in neue Ordner packen.

    "If the media files for the movies (mkv, avi, mp4, etc.) are all in a single folder, you can use the renamer to automatically create individual folders and put the respective media files into new folders. Only the movie’s media file is moved to the new folder (no artwork)."

    Ist jetzt nur keine Terminal Lösung.

  • Das Script bei Stackoverflow wird aber nicht 1:1 funktionieren. Ist aber auf jeden Fall schon mal ein guter Hinweis, wie es funktionieren könnte.

    Die reden dort von MacOS. Dann ist es schon mal ZSH als Shell und nicht die Bash. Da gibt es kleine aber doch wichtige Unterschiede. Man sollte also wenigstens noch die Shebang #!/bin/bash mit hinzufügen, damit der Interpreter das vernünftig versteht wenn man ein Bash-Script haben möchte.

    Weiter geht man bei dem Link davon aus, dass ein "-" mit im Dateinamen ist. Das ist hier aber nicht der Fall. Hier soll alles exklusive der Dateiendung mit im Namen des Verzeichnisses stehen. Da also bitte gut aufpassen ;)

    Und noch zusätzlich sollte erwähnt werden, dass die KLEINSTE Veränderung in der Dateinamenstruktur sehr unerwünschte Ergebnisse liefern kann. Bis hin zum Datenverlust. Ich würde also vorher erstmal nur mit "echo" arbeiten und die Ausgabe in eine Datei umlenken bevor ich so ein Script auf 1000 Dateien abfeuere ;).

    Ist nur ein gut gemeinter Rat. ;)

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Ich würde ja sowas machen:

    Bash
    #!/bin/bash
    
    
    for i in $(find . -type f -name '*.iso' -maxdepth 1 2> /dev/null); do
      base=$(basename "$i" .iso)
      echo "Erstelle Ordner mit Name: $base"
      # mkdir "$base"
      echo "verschiebe $i nach $base"
      # mv "$i" "$base"
    done


    Das stellt erstmal sicher, dass nur echte Dateien (-type f) und keine Ordner gefunden werden und auch nur Dateien mit einer gewissen Endung (-name *.iso). Wer weiß ob in dem Ordner nicht auch noch jpgs dring sind ;) .

    Weiter beschränken wir das Auffinden von Dateien auf den Ordner, in dem man sich gerade befindet. Es wird also nicht rekursiv gesucht (-maxdepth 1).

    Fehlermeldungen (ja find macht am Anfang eine Zeile mit einer Fehlermeldung, die aber unwichtig ist) verschieben wir nach "/dev/null" (2> /dev/null).

    Dann legen wir eine Variable fest, die den Namen der gefundenen Datei ohne die Endung ".iso" hat. Die Zeile, die mit "base=" anfängt. "basename" nimmt den Dateinamen und wenn die Datei mit .iso aufhört, dann schneidet der Befehl die Endung ab.

    Anhand der Variable können wir dann einen Ordner anlegen.

    Da wir immer noch wissen, wie der Dateiname vollständig ist (das $i von "for i in $(find.....") können wir jetzt sagen, verschiebe mir die Datei in den Ordner.

    Nachteil an der Sache ist, dass man das Script vielleicht mehrmals durchlaufen lassen muss, wenn man *.iso oder auch *.mkv Dateien hat. Dann muss man alle was im obigen Schnipsel "iso" heißt zu der entsprechenden Endung ändern und dann nochmal durchlaufen lassen. Die bösen Sachen habe ich auch erstmal auskommentiert. Wenn die Echos das richtige anzeigen, dann kann man Dinge "scharf" schalten ;)

    Das Script würde ich so in eine Datei packen und dann erstmal so ausführen:

    ./mv-script > logging.txt

    Dann kann man sich in aller Ruhe die Datei anschauen und nachvollziehen, was da gemacht wurde. Ist man zufrieden, dann kann man es auf den Rest drauf los jagen.

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Jo...das kann man natürlich auch machen:

    Bash
    #!/bin/bash
    mv() {
      base=$(basename "$1" .iso)
      mkdir "$base"
      mv "$1" "$base"
    }
    
    
    find . -type f -name '*.iso' -maxdepth 1 -exec mv {} ';'


    Nicht getestet. Nur gerade und aus dem Kopf getipselt. Könnte da vielleicht auch noch Probleme mit Leerzeichen geben.

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

    2 Mal editiert, zuletzt von DaVu (8. Juni 2021 um 23:02)

  • Der letzte Backslash ist zu viel - oder übersehe ich da was? (Andersrum - \; ist allerdings ein typisches Ende von find -exec)

    Ich denke, das ist ne gute Lösung. Für Pedanten, mit rudimentärer Fehlerbehandlung und für den Fall, dass ein Dateiname mit "-" anfangen kann mv() modifizieren (ungetestet):

    Code
    mv() {
    base=$(basename -- "$1" .iso) && mkdir "$base" && mv "$1" "$base"
    }


    Ich denke, so sind auch Leerzeichen ok (und waren das auch schon in deinem Beispiel). Zeigt aber auch, dass so ein Beispiel in der "echten" Praxis ganz schön schnell paar Fallen haben kann, und von wenig erfahrenem User auch schwer zu testen ist.

    Edit, bei Unterverzeichnissen wird es jetzt wohl schief gehen. Beim find weiter oben war das noch anders

    Kodi 21.0, 17.6, 20.5, 16, 20.5 on Windows 11 Pro, Android 6, Android 12, FireTV Box 2nd Gen, FireTV 4k Max 2nd Gen
    Media on NAS, OpenMediaVault 6 (Debian Linux).

    2 Mal editiert, zuletzt von buers (8. Juni 2021 um 19:43)

  • Der letzte Backslash ist zu viel - oder übersehe ich da was?

    Nein, du übersiehst nichts ;). Du hast einfach Recht :D


    Edit, bei Unterverzeichnissen wird es jetzt wohl schief gehen. Beim find weiter oben war das noch anders

    Was meinst du? Ich habe in meinem ersten Beispiel schon im "find" ein "-type f" eingesetzt, damit nur "Dateien" und keine "Ordner" gefunden werden. Oder verstehe ich dich falsch?

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Ich: bei Unterverzeichnissen wird es jetzt wohl schief gehen. Beim find weiter oben war das noch anders

    Was meinst du? Ich habe in meinem ersten Beispiel schon im "find" ein "-type f" eingesetzt, damit nur "Dateien" und keine "Ordner" gefunden werden. Oder verstehe ich dich falsch?

    Ich begebe mich bisschen auf Glatteis, weil ungetestet. Oben hattest du -maxdepth 1, jetzt nicht mehr. Oben war erwähnt: "nur aktueller Ordner" (nicht rekursiv in Unterordnern). Jetzt fehlte das maxdepth. Damit würde man vermuten, geht das Skript auch weiter oben in einer Ordner-Hierarchie. Das wird aber schiefgehen (oder überraschendes Ergebnis haben) weil basename nicht nur die Extension wegnimmt, sondern auch den Pfad-Anteil. Damit wird im guten Falle eine vorhandene Ordner-Hierarchie abgeflacht. Im schlechteren Falle droht Datenverlust. (Im besten Falle, direkt auf unterster Ebene ausgeführt - kein Problem). Klar, wenn ein vollständiger "Ordner-Hierarchie-Umbau" gefragt ist, mag das passen.

    Am Rande - und war nicht die Frage. Wenn man wirklich nur 3000 .mkv oder .iso in einem Ordner rumliegen hat, nix mehr. Kann da keinen Vorteil erkennen, da Ordner einzuführen, und statt 3000 Dateien in einem Ordner (sagen wir mal 3001 Objekte) nun 3000 Ordner und 3000 Dateien hat (6000 Objekte). Man wird sehen, dass solche scheinbar einfachen Skripte, die wir hier diskutieren, oft noch schwieriger werden.

    Kodi 21.0, 17.6, 20.5, 16, 20.5 on Windows 11 Pro, Android 6, Android 12, FireTV Box 2nd Gen, FireTV 4k Max 2nd Gen
    Media on NAS, OpenMediaVault 6 (Debian Linux).

  • Damn....das maxdepth habe ich tatsächlich auch vergessen . So würde er auch eventuell vorhandene Unterverzeichnisse durchsuchen. Ich passe das nochmal an. Danke für den hinweis ;)

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Am Rande - und war nicht die Frage. Wenn man wirklich nur 3000 .mkv oder .iso in einem Ordner rumliegen hat, nix mehr. Kann da keinen Vorteil erkennen, da Ordner einzuführen, und statt 3000 Dateien in einem Ordner (sagen wir mal 3001 Objekte) nun 3000 Ordner und 3000 Dateien hat (6000 Objekte). Man wird sehen, dass solche scheinbar einfachen Skripte, die wir hier diskutieren, oft noch schwieriger werden.

    Der Vorteil kommt nachher wenn du einen Export in separate Dateien machst. Dann legt kodi eine NFO und mehrere JPG Dateien ab. Das ist dann etwas schöner und strukturierter, wenn Kodi das in entsprechenden Ordnern passend zum Film macht. Es geht auch so und ohne Unterordner, es wird aber ein wenig unübersichtlich, wie ich finde. Ich habe auch für jeden Film einen Unterordner und ich komme bei weitem nicht auf die 3000 :D

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Bash
    #!/bin/bash
    for file in *.mkv; do
        dir=${file%%.*}
        mkdir -p -- "$dir"
        mv "$file" "$dir"
    done

    das war die Lösung

    https://stackoverflow.com/a/37012614

    hab nur die echo entfernt und voila... alle Filme brav in den gleichnamigen Ordner

    vielen Dank allen die geholfen haben

    H96max x3 32/4GB 64GB Sandisk U3
    CoreElec 19.2 Matrix

    X96mini S905W 16/2GB 32GB Sandisk U3
    CoreElec 19.2 Matrix

  • Für alle, die sie etwas machen wollen/müssen, aber Windows-User sind, mit dem Multi-Umbenennen-Tool des Total Commanders geht das auch recht einfach.
    Ob die Linux-Varianten vom TC (Krusader o.ä.) das auch können, weiß ich allerdings nicht.

  • Gut, dass es geklappt hat, @Metallica. Für Leser, die das auch so machen wollen, kleine Warnung, das Skript bringt nicht das erwünschte Ergebnis bei Punkt (".") innerhalb des Titels, z.B. "Mr. und Mrs. Smith(2005).mkv" ist ein nicht soo unwahrscheinlicher Dateiname. Verzeichnisname würde dann zu "Mr" verkürzt. (Ansonsten erkennt man schon, dass das Skript einen erfahrenen Autor hat, z.B. an einem Detail wie das "--" im mkdir Befehl. Dabei fällt mir grade auf, ob das -- nicht auch hinter mv gehört - auch in dem von mir weiter oben gezeigten Code Snippet ...).

    Kodi 21.0, 17.6, 20.5, 16, 20.5 on Windows 11 Pro, Android 6, Android 12, FireTV Box 2nd Gen, FireTV 4k Max 2nd Gen
    Media on NAS, OpenMediaVault 6 (Debian Linux).

    Einmal editiert, zuletzt von buers (9. Juni 2021 um 07:54)

  • Da hast du sicherlich recht - nur das ist nicht ganz trivial. Die Lösung von @DaVu macht das grundsätzlich richtig, weil das basename-Kommando halt wirklich nur die genannte Extension *am Ende* wegnimmt. Aber basename nimmt halt auch den Ordnerteil des Filenamens weg, was die Rekursion durch alle Directories für genau diese Aufgabe erschwert. Da für @Metallica das Problem gelöst ist, ist der Ansporn da eine perfekte Lösung zu finden etwas gesunken. Ich persönlich würde mir einen (geschätzt) 20-Zeiler in C oder C++ schreiben, was so ähnlich wie basename die Extension wegnimmt, aber Pfad-Teil beibehält. Für einen sed-Spezialisten ist es sicherlich auch nur ne kleine Fingerübung. Vielleicht gibt es auch eingebaute bash Funktion, die genau nur benannte extension am Ende wegnimmt (kenne ich aber nicht auf Anhieb).

    Kodi 21.0, 17.6, 20.5, 16, 20.5 on Windows 11 Pro, Android 6, Android 12, FireTV Box 2nd Gen, FireTV 4k Max 2nd Gen
    Media on NAS, OpenMediaVault 6 (Debian Linux).

Jetzt mitmachen!

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