[gelöst] mv in skript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
daniel h
Beiträge: 266
Registriert: 10.03.2008 17:41:40

[gelöst] mv in skript

Beitrag von daniel h » 08.11.2016 12:45:34

Hallo.

Ich übe mich in Skripten. Ich möchte Bilder von meiner Kamera in ein bestimmtes Verzeichnis verschieben, umbennen und einsortieren.
Ich kann die Dateien ohne Probleme mit jhead umbenennen und in das Hauptverzeichnis schieben. Wenn ich jetzt aber die Bilder anhand der Namen ( Datum ) in die entsprechenden Ordner verschieben will ( die ohne Probleme angelegt werden ) bekomme ich immer folgende Meldung:

Code: Alles auswählen

mv: Fehlender Zieldatei‐Operand hinter „10*.{jpg} /home/daniel/test/10/“
Wenn ich den selben Befehl allerdings in der Bash selbst ausführe klappt alles einwandfrei.

Hier nochmal der fehlerhafte Code:

Code: Alles auswählen

if [ /home/daniel/test/10*.jpg ]
 then
  mkdir -p "/home/daniel/test/10/"
fi

if [ /home/daniel/test/10/ ]
  then
    mv "/home/daniel/test/10*.jpg /home/daniel/test/10/"
fi
Was mache ich falsch bzw. was übersehe ich? Skripte in der Art gibt es im übrigen zuhauf im Netz und ich weiß die Sache bläst sich je nach Umfang ziemlich auf, aber so sollte es doch auch gehen.

Vielen Dank,
Daniel
Zuletzt geändert von daniel h am 08.11.2016 21:42:04, insgesamt 1-mal geändert.

thoerb
Beiträge: 1685
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: mv in skript

Beitrag von thoerb » 08.11.2016 13:32:59

Code: Alles auswählen

    mv "/home/daniel/test/10*.jpg /home/daniel/test/10/"
Ich vermute das liegt hier an den Anführungszeichen. Versuch es mal ohne.

TomL

Re: mv in skript

Beitrag von TomL » 08.11.2016 13:42:03

daniel h hat geschrieben:

Code: Alles auswählen

mkdir -p "/home/daniel/test/10/"
mv "/home/daniel/test/10*.jpg /home/daniel/test/10/"
Anführungszeichen wären ok, wenn es möglicherweise Dateinamen mit beinhaltenden Blanks gäbe, aber dabei Quelle und Ziel separat behandeln. Ich würde das deshalb wie folgt ändern, und zusätzlich auch vollständige Pfade verwenden:

Code: Alles auswählen

/bin/mkdir -p "/home/daniel/test/10"
/bin/mv "/home/daniel/test/10*.jpg" "/home/daniel/test/10/"
Zuletzt geändert von TomL am 08.11.2016 13:45:18, insgesamt 1-mal geändert.

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

Re: mv in skript

Beitrag von Meillo » 08.11.2016 13:44:55

thoerb hat geschrieben:

Code: Alles auswählen

    mv "/home/daniel/test/10*.jpg /home/daniel/test/10/"
Ich vermute das liegt hier an den Anführungszeichen. Versuch es mal ohne.
Diese Vermutung ist korrekt.

Der Stern wird nur expandiert, wenn er ausserhalb von Anfuehrungsstrichen steht. Ebenso muessen das separate Argumente sein, darum duerfen sie nicht mit den Anfuehrungszeichen zu einem zusammengefasst werden.

Daumenregel: Um Variablenexpansionen sind Anfuehrungszeichen wichtig (z.B. "$foo") und um Leerzeichen in Dateinamen zu maskieren ebenfalls (z.B. "eine Datei.txt"). Fuer fixe Strings ohne Leerzeichen und ohne besondere Sonderzeichen (wie Klammern) brauchst du sie nicht.
Use ed once in a while!

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

Re: mv in skript

Beitrag von Meillo » 08.11.2016 13:46:32

TomL hat geschrieben: Ich würde das deshalb wie folgt ändern, und zusätzlich auch vollständige Pfade verwenden:

Code: Alles auswählen

/bin/mkdir -p "/home/daniel/test/10"
/bin/mv "/home/daniel/test/10*.jpg" "/home/daniel/test/10/"
So wird die Datei namens ``10*.jpg'' verschoben und nicht alle Dateien die mit ``10'' beginnen und mit ``.jpg'' enden.

Fuer die Standardtools (mv, mkdir) wuerde ich, im Gegensatz zu dir, *keine* absoluten Pfade verwenden.
Use ed once in a while!

TomL

Re: mv in skript

Beitrag von TomL » 08.11.2016 13:48:25

Meillo hat geschrieben:Der Stern wird nur expandiert, wenn er ausserhalb von Anfuehrungsstrichen steht.
Habs gerade mal getestet.... tatsächlich... is ja irre... das wusste ich auch noch nicht.....
Meillo hat geschrieben:Fuer die Standardtools (mv, mkdir) wuerde ich, im Gegensatz zu dir, *keine* absoluten Pfade verwenden.
Warum nicht? Relative Pfade können einen doch böse überraschen, wenn man nicht wirklich gut aufpasst.....

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

Re: mv in skript

Beitrag von Meillo » 08.11.2016 14:29:47

TomL hat geschrieben:
Meillo hat geschrieben:Fuer die Standardtools (mv, mkdir) wuerde ich, im Gegensatz zu dir, *keine* absoluten Pfade verwenden.
Warum nicht? Relative Pfade können einen doch böse überraschen, wenn man nicht wirklich gut aufpasst.....
Na wenn du das so siehst ... soviel waere ich nicht bereit zu opfern fuer die vielleicht etwas hoehere Sicherheit. Denk nur mal an die ganzen Probleme, die du bekommst, weil z.B. die Bash bei GNU/Linux unter /bin/bash liegt, bei BSD aber unter /usr/pkg/bin/bash oder so aehnlich. Und was ist mit `test'? Schreibst du dann /bin/[ ? Oder vertraust du darauf, dass test schon als Builtin mitgeliefert werden wird? Und `echo' und `printf'?

Was man eher machen koennte, waere, $PATH aktiv zu setzen, weil wenn es da mit ``/bin'' beginnt, dann wird das `mv' sowieso von dort genommen. Wobei ... exportierte Funktionen ... Uff, ach ja, ... na dann macht was ihr wollt. :-D

Ich hab's lieber gut lesbar und moeglichst portabel. Dafuer nehme ich ein gewisses Risiko in Kauf. Den allermeisten anderen geht's scheinbar ebenso.
Use ed once in a while!

TomL

Re: mv in skript

Beitrag von TomL » 08.11.2016 15:05:47

Meillo hat geschrieben:Ich hab's lieber gut lesbar
Vor diesem Hintergrund war aber zumindest diese Aussage nicht eindeutig:
Meillo hat geschrieben:Fuer die Standardtools (mv, mkdir) wuerde ich, im Gegensatz zu dir, *keine* absoluten Pfade verwenden.
Denn ich habe das so interpretiert..... anstatt

Code: Alles auswählen

mkdir -p /home/daniel/test/10
mv /home/daniel/test/10*.jpg /home/daniel/test/10/
lieber

Code: Alles auswählen

mkdir -p ~/test/10
mv ~/test/10*.jpg ~/test/10/
verwenden. Und genau darauf bezog sich meine Frage mit dem "Warum" und der möglicherweise bösen Überraschung. Aber anscheinend, so ist mir erst jetzt ein Licht aufgegangen, meintest Du das gar nicht, sondern den Pfad zum Binary. Da systemd beim Ausführen seiner Units in der Stable-Version aber noch keine Path-Angaben kennt, gehe ich einfach nur den für mich einfachsten Weg mit vollständigem Pfad zum Binary.... und kompatibel müssen meine Scripte nur zu meinen Debian-Installationen sein.

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

Re: mv in skript

Beitrag von Meillo » 08.11.2016 16:35:12

Ahh, ja da haben wir uns dann missverstanden. Tut mir leid.
Use ed once in a while!

daniel h
Beiträge: 266
Registriert: 10.03.2008 17:41:40

Re: mv in skript

Beitrag von daniel h » 08.11.2016 21:41:25

Hallo.

Es hat tatsächlich an den Anführungszeichen gelegen. Vielen Dank für den Hinweis. Ich baue das ganze noch etwas aus. Den Hinweis mit zu den Verzeichnissen setze ich um, war mir so nicht klar.

Danke,
Daniel

Antworten