[Gelöst] Ordner einsortieren mit Bash - Script funktioniert nicht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Maex
Beiträge: 4
Registriert: 06.05.2019 19:25:36

[Gelöst] Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von Maex » 06.05.2019 20:11:51

Hallo liebe Community!
Zu aller erst: Ich bin absoluter Anfänger in Sachen Programmieren und Scripting etc... Nehmt bitte Rücksicht ^^

Jetzt zu meinem Problem: Ich hab einen NAS auf dem Openmediavault und Plex. Meine Idee war es, dass in einem Ordner Bilderalben abgelegt werden können. Zu einer bestimmten Zeit läuft dann ein Script durch, welches dieses Album innerhalb von Plex einsortiert. Also quasi den Ordner "201904-Urlaub" nach "*/Photos/2019/04-Urlaub" verschiebt.

Das folgende ist bestimmt nicht hübsch, aber hoffentlich nachvollziehbar geschrieben. Kann mir jemand verraten, warum das nicht sauber durchläuft?

Code: Alles auswählen

#!/bin/bash

# Quellverzeichnis der alten Struktur
source=/share/alben

# Zielverzeichnis für die neue Struktur:
target=/plexmedia/photos

for i in ~/alben/*/*
do	
	# Extrahiere aus dem Pfad Jahr und Monat
	eventce=${i%-*}
	event=${eventce##*/}
	year=${event:0:4}
	month=${event:4:2}
	
	# Extrahiere Name und erstelle Zielpfad
	namece=${i%/*}
	name=${namece#*-}
	targetdirname="$month-$name"
	targetpath="$target/$year/$targetdirname"

    # Erstelle das Zielverzeichnis (wenn vorhanden, dann egal) und verschiebt die Datei:
    mkdir -p "$targetpath"
    mv "$i" "$targetpath"
done
Im Terminal bekomme ich vor allem beim extrahieren von Jahr, Monat und Albumname Fehlermeldungen:

Code: Alles auswählen

syntax error near unexpected token `$'eventce=${i%-*}\r''
Hoffe ihr könnt mir ein paar Tipps geben :D
Zuletzt geändert von Maex am 07.05.2019 13:26:35, insgesamt 1-mal geändert.

tobo
Beiträge: 1989
Registriert: 10.12.2008 10:51:41

Re: Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von tobo » 06.05.2019 20:54:12

Am einfachsten schaust du dir bei solchen Sachen die Variablen nach der Befüllung an, dann weißt du auch direkt, wo der Fehler steckt. In deinem Fall beim "Umweg" über event. Alles Überflüssige mal weggelassen, könnte sowas funktionieren:

Code: Alles auswählen

for i in ~/alben/*/*
do	
	# Extrahiere aus dem Pfad Jahr und Monat
	year=${i:0:4}
	month=${i:4:2}
	
	# Extrahiere Name und erstelle Zielpfad
	name=${i#*-}
	targetdirname="${month}-${name}"
	targetpath="${target}/${year}/${targetdirname}/"

    # Erstelle das Zielverzeichnis (wenn vorhanden, dann egal) und verschiebt die Datei:
    mkdir -p "$targetpath"
    mv "$i" "$targetpath"
done
Die ergänzten {} sind hier zwar nicht entscheidend, da nach den Variablennamen kein gültiges Zeichen für einen Variablenamen folgt, erhöhen aber die Lesbarkeit. Wenn die Anzahl der Zwischenvariablen zu hoch wird oder jeder Zwischenschritt zwischengespeichert wird, dann leidet auch die Lesbarkeit.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von Meillo » 06.05.2019 23:47:10

@tobo: Aber das ist doch ein Syntax-Fehler:
Maex hat geschrieben: ↑ zum Beitrag ↑
06.05.2019 20:11:51

Code: Alles auswählen

syntax error near unexpected token `$'eventce=${i%-*}\r''
... also nichts was an der Verarbeitung liegt, sondern am Script selbst. Oder stehe ich zu dieser spaeten Stunde auf dem Schlauch?

Das Token, das er meldet sieht auch recht seltsam aus. Wo kommt denn das Dollarzeichen her? Und das Quoting ist auch komisch. Und macht das CR am Ende (von Windows?) bei einer Unix Bash Probleme?

Ansonsten kommt mir irgendwie noch in den Sinn, dass da irgendwas war mit, dass bei einer Schleife nach dem `do' kein Kommentar folgen darf, sondern ein Befehl kommen muss ... aber vielleicht bringe ich da auch was durcheinander. Es ist schon spaet. ;-)
Use ed once in a while!

tobo
Beiträge: 1989
Registriert: 10.12.2008 10:51:41

Re: Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von tobo » 07.05.2019 02:34:15

Gemeldet ist ein Syntaxfehler, ja - ich kann das aber mit dem Quelltext dort oben nicht nachvollziehen. Der Fehler korrespondiert schlicht nicht mit dem, was da steht!? Bei mir (C/P) ist syntaktisch alles in Ordnung und läuft auch durch. Nur das Ergebnis ist halt nicht das Erwünschte.

Mein Text war aber trotzdem Quatsch, weil ich die Problemstellung überhaupt nicht begriffen hatte. Das hat sich jetzt immerhin im Punkt des vollqualifizierten Dateinamens und im Verhältnis Datei/Verzeichnis geändert. Was das Zielverzeichnis betrifft, da widersprechen sich aber Quelltext und Kommentare!? Trotzdem sollte eine der beiden Lösungen passen:

Code: Alles auswählen

#!/bin/bash

# Quellverzeichnis der alten Struktur  ### Unten steht $HOME/alben 
source=/share/alben

# Zielverzeichnis für die neue Struktur:
target=/plexmedia/photos

for i in ~/alben/*/*
do  
    # Prüfe auf Existenz
    [ -d "$i" ] || continue

    # Extrahiere Dateiname
    fn=${i##*/}

    # Extrahiere Jahr, Monat und Name
    year=${fn:0:4}
    month=${fn:4:2}
    name=${fn#*-}

    ## 1.Fall
    # Verschiebe Verzeichnis  [201904-Urlaub generiert /Photos/2019/04-Urlaub/201904-Urlaub]
    targetpath="${target}/${year}/${month}-${name}"
    mkdir -p "$targetpath"
    mv "$i" "$targetpath/"

    ## 2.Fall
    # Verschiebe und benenne Verzeichnis um [201904-Urlaub generiert /Photos/2019/04-Urlaub]
#    targetpath="${target}/${year}"
#    mkdir -p "$targetpath"
#    mv "$i" "${targetpath}/${month}-${name}"
done

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von Meillo » 07.05.2019 06:59:50

Meillo hat geschrieben: ↑ zum Beitrag ↑
06.05.2019 23:47:10
Ansonsten kommt mir irgendwie noch in den Sinn, dass da irgendwas war mit, dass bei einer Schleife nach dem `do' kein Kommentar folgen darf, sondern ein Befehl kommen muss ... aber vielleicht bringe ich da auch was durcheinander. Es ist schon spaet. ;-)
Jetzt ist's mir wieder eingefallen: Das war bei Labels in C der Fall, denen muss ein Statement folgen. Somit tut das hier nichts zur Sache.


@tobo: Ja, die Fehlermeldung ist seltsam. Wenn du sagst, dass der Code bei dir 1:1 durchgelaufen ist, dann wuerde ich sagen, dass es nicht an dem hier geposteten Code sondern an etwas anderem liegt.

@Maex: Teste mal tobos Code. Funktioniert der? Und welche Version hat deine Bash?

Code: Alles auswählen

/bin/bash --version
Use ed once in a while!

Maex
Beiträge: 4
Registriert: 06.05.2019 19:25:36

Re: Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von Maex » 07.05.2019 11:36:51

Hey hey,

vielen Dank für die schnelle Hilfe! Ich hab noch ein paar Fehler gefunden und hab ein bisschen dran rumgeschraubt. Jetzt funktioniert es!
Hab aber direkt noch eine Zeile eingesetzt, damit Plex auch Zugriff auf die Daten bekommt.

Code: Alles auswählen

#!/bin/bash

# Quellverzeichnis der alten Struktur
source=/sharedfolders/Pleximport

# Zielverzeichnis für die neue Struktur:
target=/sharedfolders/plexmedia/Pictures

for i in /sharedfolders/Pleximport/*/*
do	
	# Extrahiere aus dem Pfad Jahr und Monat
	year=${i:26:4}
	month=${i:30:2}
	
	# Extrahiere Name und erstelle Zielpfad
	tmp=${i#*-}
	name=${tmp%/*}
	targetpath="${target}/${year}/#${month}_${name}/"

	# Erstelle das Zielverzeichnis (wenn vorhanden, dann egal) und verschiebt die Datei
	mkdir -p "$targetpath"
	mv "$i" "$targetpath"

	# Plex die Rechte an der Datei geben
	chown -R plex "$targetpath"
done

echo "Aufgabe beendet, Bilder verschoben"
@tobo: Mit dem Quellverzeichnis ist mir auch aufgefallen, ist geändert.
@Meillo: Wie die Fehlermeldung jetzt zustande kam, hab ich leider noch nicht ganz verstanden. Bash: Version 4.4.12(1)-release

Aber jetzt läuft es und macht genau was es soll! Einen Ordnernamen aufschlüsseln und dann gezielt verschieben und umbenennen.
Danke für die Hilfe!

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von Meillo » 07.05.2019 13:18:37

Maex hat geschrieben: ↑ zum Beitrag ↑
07.05.2019 11:36:51
@Meillo: Wie die Fehlermeldung jetzt zustande kam, hab ich leider noch nicht ganz verstanden. Bash: Version 4.4.12(1)-release
Hast du das originale Script als Datei noch? Es waere interessant mal `file' dafuer aufzurufen, was das ausgibt.

Aber jetzt läuft es und macht genau was es soll! Einen Ordnernamen aufschlüsseln und dann gezielt verschieben und umbenennen.
Danke für die Hilfe!
Hier im Forum ist es ueblich, geloeste Themen im Titel als solche zu kennzeichnen, d.h. den ersten Post zu bearbeiten und vor den Titel ein ``[geloest]'' einzufuegen. Es waere nett, wenn du das noch machen koenntest. :-)
Use ed once in a while!

Maex
Beiträge: 4
Registriert: 06.05.2019 19:25:36

Re: Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von Maex » 07.05.2019 13:31:44

Meillo hat geschrieben: ↑ zum Beitrag ↑
07.05.2019 13:18:37

Hast du das originale Script als Datei noch? Es waere interessant mal `file' dafuer aufzurufen, was das ausgibt.
Was genau meinst du mit "file" dafür aufrufen? Die Datei hab ich noch, kann sie dir auch gerne hochladen. :)

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von Meillo » 07.05.2019 13:46:22

Maex hat geschrieben: ↑ zum Beitrag ↑
07.05.2019 13:31:44
Meillo hat geschrieben: ↑ zum Beitrag ↑
07.05.2019 13:18:37

Hast du das originale Script als Datei noch? Es waere interessant mal `file' dafuer aufzurufen, was das ausgibt.
Was genau meinst du mit "file" dafür aufrufen? Die Datei hab ich noch, kann sie dir auch gerne hochladen. :)
Mich wuerde die Ausgabe von dem Befehl interessieren:

Code: Alles auswählen

file dein-script.sh

Btw: Danke fuer die umgehend durchgefuehrte geloest-Kennzeichnung. :THX:
Use ed once in a while!

tobo
Beiträge: 1989
Registriert: 10.12.2008 10:51:41

Re: Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von tobo » 07.05.2019 22:50:07

Maex hat geschrieben: ↑ zum Beitrag ↑
07.05.2019 11:36:51
Aber jetzt läuft es und macht genau was es soll!
Dann lass dein Skript mal zweimal hintereinander laufen, dann erkennst du die Bewandtnis von [ -d "$i" ] || continue.

Maex
Beiträge: 4
Registriert: 06.05.2019 19:25:36

Re: [Gelöst] Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von Maex » 09.05.2019 19:12:18

@Maillo Das Ergebnis des Befehls ist:

Code: Alles auswählen

Bourne-Again shell script, UTF-8 Unicode text executable

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [Gelöst] Ordner einsortieren mit Bash - Script funktioniert nicht

Beitrag von Meillo » 09.05.2019 20:43:58

Maex hat geschrieben: ↑ zum Beitrag ↑
09.05.2019 19:12:18
@Maillo Das Ergebnis des Befehls ist:

Code: Alles auswählen

Bourne-Again shell script, UTF-8 Unicode text executable
Hmm, nichts Auffaelliges an der Stelle. Dann weiss ich auch nicht. Vielleicht war's dann ja doch Magie. :-D
Use ed once in a while!

Antworten