Datei nach Namensinhalt verschieben

  • Hallo zusammen,

    leider bin ich ziemlich neu im Thema script und Debian von daher stelle ich hier mal meine Frage ein, da ich nicht genau weiß wie ich danach am besten Suche.

    Ich hätte gerne ein Script was folgendes durchführt:

    In einem Ordner habe ich viele Dateien die nach Datumsformat benannt sind, Bsp YYYYMMDD-1234.
    Das Datumsformat ist natürlich fortlaufend. Das Script soll alle Dateien von dem selben Tag in einen Ordner verschieben, der wiederum in Abhängigkeit des Datums erst erstellt werden muss.
    Da mehrere Dateitypen im Ordner sind sollte es Typunabhängig sein.

    Die Finale Ordnerstruktur sollte wie folgt sein:
    Jahr - Unterordner Monatsname - Unterordner Tag
    Bsp. Ordner 2016 - Unterordner September - Unterordner 01 --> für 01.09.2016

    Wäre schön wenn ich zudem Script eine kleine Erklärung bekommen könnte um den Lerneffekt zu steigern :D

    Danke im Vorraus

  • Alternativer Lösungsvorschlag. Allerdings mit kleinen Fehlern die Du selbst korrigieren musst :D

  • Hallo,

    bin leider kein Stück voran gekommen und blicke nicht so wirklich durch :no_sad:
    Habe einiges probiert, aber ohne Erfolg.
    Kann mir jemand ein fertiges Script zur Verfügung stellen, damit ich mir das ganze mal genauer anschauen kann?
    Würde mir das ganze einfacher machen zu erlernen wenn ich dazu noch im groben die Kommentare hätte was wann passiert ...

    Danke im Voraus.

    Mfg

  • Kann mir jemand ein fertiges Script zur Verfügung stellen, damit ich mir das ganze mal genauer anschauen kann?

    Die obigen Script sind fertig.

    Habe einiges probiert, aber ohne Erfolg.

    Was hast du probiert und wobei hats dann nicht funktioniert?


    Würde mir das ganze einfacher machen zu erlernen wenn ich dazu noch im groben die Kommentare hätte was wann passiert ...

    Dann frag halt gezielter was du nicht verstehst - würde es uns einfacher machen :fies:


    PS: Bitte nicht wieder ein Monat mit der nächsten Antwort warten.

  • Sorry für die verspätete Antwort meinerseits, habs aus den Augen verloren ;)

    Leider scheitert es schon am Anfang des Scripts von framp.
    Wie oder wo muss ich den das Verzeichnis angeben, wo die Dateien liegen?

    Wie funktioniert das mit der Handhabung der Zahlen?

    Code
    if [[ ! $file =~ ^[0-9]{7}.* ]]; then

    Für was steht ^[0-9]{7}?

    und bei z.B:

    Code
    month=${file:4:2}                    # extract month (char 5 to 6)


    Wieso 4:2 für die 5&6 Stelle des Dateinamens?

    gruß

  • ^[0-9]{7}.* => alles außer den Zahlen 0 bis 9, und nur 8 Zechen lang (wenn hinter der Zeichen mit dem Index 7 noch etwas kommt, abbrechen)
    ${file:4:2} => von der Variablen ${file} ab dem vierten Zeichen, zwei Zeichen negmen. Damit würde man, wenn das Datum 20160901 lautet, "09", den Monat, erhalten.
    ${file:6:2} => nimmt den Tag nach dem gleichen verfahren.
    Für das Jahr wäre ein ${file:0:4} notwendig.

    Computer ..... grrrrrr

  • Super, danke. Das macht es etwas klarer :thumbs1:

    Meine Dateien, welche ich sortieren will haben z.B folgende Namen:
    20161120152407.avi
    20161031160242-14.jpg

    kann das dann überhaupt so funktionieren?
    Wie bzw wo muss ich mein Verzeichnis zuordnen?

    mfg


  • ^[0-9]{7}.* => alles außer den Zahlen 0 bis 9, und nur 8 Zechen lang (wenn hinter der Zeichen mit dem Index 7 noch etwas kommt, abbrechen)


    Stimmt nicht ganz :shy: : Es müssen 7 Mal Zahlen am Anfang stehen gefolgt von einer beliebigen Anzahl weitere Zeichen. Deine Erklärung passt zu dem folgenden Regex: [^0-9]{8}.*
    Automatisch zusammengefügt:

    ...Meine Dateien, welche ich sortieren will haben z.B folgende Namen:
    20161120152407.avi
    20161031160242-14.jpg

    kann das dann überhaupt so funktionieren?


    Der Regex verlangt sieben Zahlen am Anfang des Namens. Das trifft doch zu :rolleyes:

    Zitat

    Wie bzw wo muss ich mein Verzeichnis zuordnen?

    Code
    for file in $(ls -d */); do

    Der Befehl ls -d */ wird im aktuellen Verzeichnis ausgeführt.

  • Bedeutet das das Script auch in dem Ordner gespeichert werden muss wo die Dateien liegen?

    Kann man das auch globaler ausführen das ich in dem Script den Ordnerpfad einfügen kann, wo die Daten liegen die sortiert werden sollen?

  • Ich würde dir raten das Script einfach mal auszuprobieren bzw rum zu spielen... try&error ... learning by doing

    Auf die Weise hättest Du dir bereits die letzten 3 Fragen selber beantworten können


    Deshalb hat framp auch bewusst ein paar Fehler eingebaut die Du nur finden und lösen kannst wenn Du selber das Script mal ausprobierst bzw mal hier und da was am Code änderst. Kaut man etwas fix und fertig vor lernt man nix dabei


  • Bedeutet das das Script auch in dem Ordner gespeichert werden muss wo die Dateien liegen?

    Nein.
    Z.B. stellst Du das Script in /home/pi als myScript.sh und machst es ausführbar (man chmod). Dann wechselst Du in /home/pi/meineDaten und führst da das Script aus mit ~/myScript.sh

    Zitat

    Kann man das auch globaler ausführen das ich in dem Script den Ordnerpfad einfügen kann, wo die Daten liegen die sortiert werden sollen?

    Ja

    Code
    for file in $(ls -d */); do

    ändern in

    Code
    for file in $(ls -d ~/meineDaten*/); do

    Aber dann ist das Script inflexibel da nur immer Daten aus einem Verzeichnis bearbeitet werden können.

    Ansonsten solltest Du den Tipp von meigrafd beherzigen ;)

  • So ich habe jetzt eine Lösung die funktioniert.

    Zitat

    ändern in

    Code
    for file in $(ls -d ~/meineDaten*/); do

    Aber dann ist das Script inflexibel da nur immer Daten aus einem Verzeichnis bearbeitet werden können.

    Habe die Ordnerauswahl so gelöst:

    Code
    cd /home/pi/Motion/Garten
    for file in $(ls -d *); do


    im Gesamten sieht mein Script jetzt so aus:

    Habe dich echo´s rausgenommen, da das Script ja eh im Hintergrund läuft.
    Dieses lasse ich jetzt einmal am Tag per cron laufen und dann habe ich meine automatische Sortierung.

    Vielen Dank für eure Hilfe!

  • Das sieht doch sehr gut aus :thumbs1: Du koenntest noch %b in %B aendern beim date Aufruf damit Du den vollstaendigen Monatsnamen bekommst wie Du mal ganz am Anfang geschrieben hast. Aber Mit Jan Feb usw funktioniert es ja auch.

    Ich hoffe Du hast jetzt nicht nur ein Script was das tut was Du wolltest sondern auch neue Dinge gelernt, so dass zukuenftige Scripts - die bestimmt kommen werden - Dir leichter fallen :)

  • Danke für den Tipp! Hab es gleich eingebaut.


    Du koenntest noch %b in %B aendern beim date Aufruf

    Dabei ist mir noch etwas aufgefallen. Das Script hat den Monatsnamen nur mit der Zahl benannt, ohne den direkten Namen.

    Code
    mkdir -p $year/$month/$day
    mv $file $year/$month/$day

    hab es jetzt nochmal angepasst, damit ich Monatszahl und Namen als Ordnername habe.

    Code
    mkdir -p $year/$month-$monthName/$day 
    mv $file $year/$month-$monthName/$day

    jetzt passt es perfekt! Langsam komme ich dahinter wie das mit dem Script so funktioniert ....

    Einmal editiert, zuletzt von 0018 (24. November 2016 um 10:31)


  • Dabei ist mir noch etwas aufgefallen. Das Script hat den Monatsnamen nur mit der Zahl benannt, ohne den direkten Namen.
    ...
    hab es jetzt nochmal angepasst, damit ich Monatszahl und Namen als Ordnername habe.

    Stimmt, das hatte ich auch noch falsch eingebaut. Ist aber kein funktionales Problem :lol:

    Zitat

    ...Langsam komme ich dahinter wie das mit dem Script so funktioniert ....

    :thumbs1:

  • Noch etwas:
    Obwohl es etwas unpraktischer bei tippen ist, Variablen sollte man, wenn man sie 'verknüpft', immer mit geschweiften Klammern umschließen.

    bei einem
    a=$variable
    macht es keinen Problem, hast du aber z.B. das Datum in drei Variablen $jahr, $monat und $tag, kannst leichte eine Variable $aktuellertag durch

    Code
    aktuellertag=$jahr$monat$tag


    bauen, willst du aber z.B. die Variable $erstertag erstellen, funktioniert

    Code
    erstertag=$jahr$monat01


    nicht, da es keine Variable $monat01 gibt.
    Schreibst du

    Code
    erstertag=$jahr${monat}01


    ist es wieder klar. Und dann kann man gleich anfangen

    Code
    erstertag=${jahr}${monat}01


    oder

    Code
    aktuellertag=${jahr}${monat}${tag}


    schreiben.

    Finde ich.

    Computer ..... grrrrrr

    Einmal editiert, zuletzt von Rasp-Berlin (25. November 2016 um 08:15)


  • Obwohl es etwas unpraktischer bei tippen ist, Variablen sollte man, wenn man sie 'verknüpft', immer mit geschweiften Klammern umschließen.

    Dem stimme ich zu. Man erkennt dann auch die Variablenbenutzung besser. Aber auf der deutschen Tastatur ist das schon ein Krampf ... Auf einer US Tastatur ist das auch nicht umständlich :shy: Nur hat die kaum jemand ...

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!