ClaasM
Anmeldungsdatum: 4. November 2006
Beiträge: 323
|
Ahoi. Ich habe in einem Ordner mehrere Dateien eines Types, die ich in unregelmäßigen Abständen in Ordner verschiebe, die so genannt werden wie die Dateien selbst. Dazu habe ich mir ein Script zusammelgeklöppelt (ich glaube sogar mit Hilfe dieses Forums), welches diese Aufgabe bequem übernimmt. Leider funktioniert es nur, wenn ich es in einer Shell ausführe und nicht, wenn ich es einfach anklicke. Zurgriffsrechte:
claas@claas-ThinkPad-T400:/media/extern/sortiert$ ls -ahl create_folders-from_file_name.sh
-rwxrwxr-x 1 claas claas 493 Okt 17 23:59 create_folders-from_file_name.sh
claas@claas-ThinkPad-T400:/media/extern/sortiert$ Script:
1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/sh
for EXT in gif
do
for EACHFILE in *.${EXT} #Read all files with the chosen extension
do
EACHFOLDER=${EACHFILE%\.${EXT}*} #cut extension for getting foldername
mkdir "$EACHFOLDER" #create folder
mv "${EACHFILE}" "${EACHFOLDER}/${EACHFILE}" #move every file to the corresponding folder. the "" are necessary due to spaces in the filenames
#v=`expr $v + 1` #A simple counter to show the amount of files
#echo "$v: Folder ${EACHFOLDER} created" #output on screen
done
done
|
Habt ihr eine mögliche Lösung parat? Beste Grüße
Claas Edit:
Folgendes Topic trifft wahrscheinlich exakt mein Problem, wollte es jedoch nicht kapern 😀
http://forum.ubuntuusers.de/topic/shell-script-ausfuehrbar-machen-textdatei-bei-/
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Zuerst mal wieder 1 Punkt, auf den ich schon 1000x hingewiesen habe, und der trotzdem mit schönster Regelmäßigkeit ständig wieder auftaucht:
Möglicherweise ist es das schon, ansonsten müsstest Du mal verraten, wie Du das Skript in der Shell genau ausführst (und in welcher Shell), und unter welchem Dateimanager es laufen soll. LG, track
|
aasche
Anmeldungsdatum: 30. Januar 2006
Beiträge: 14259
|
ClaasM schrieb: Unabhaengig davon, ob das Skript inhaltlich ok ist, sollte man das Linux-typische "./" zum Ausfuehren (im aktuellen Ordner) voranstellen:
/media/extern/sortiert$ ls -ahl create_folders-from_file_name.sh
-rwxrwxr-x 1 claas claas 493 Okt 17 23:59 create_folders-from_file_name.sh
/media/extern/sortiert$ ./create_folders-from_file_name.sh
|
TausB
Anmeldungsdatum: 26. November 2009
Beiträge: 1563
Wohnort: Terra incognita
|
Du nutzt bestimmt Nautilus - stimmt's?! Falls ja - dann hier die Lösung.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
track schrieb: Zuerst mal wieder 1 Punkt, auf den ich schon 1000x hingewiesen habe, und der trotzdem mit schönster Regelmäßigkeit ständig wieder auftaucht:
Gibt es dafür auch eine Quelle? Ich habe ins Bash-Manual geschaut und bei "upper" nichts derartiges gefunden, und zu "reserve" nur:
|
RESERVED WORDS
Reserved words are words that have a special meaning to the shell. The following words are recognized as reserved
when unquoted and either the first word of a simple command (see SHELL GRAMMAR below) or the third word of a case
or for command:
! case do done elif else esac fi for function if in select then until while { } time [[ ]]
|
Die sind also nun ausnahmslos klein geschrieben. Allerdings ist das zugegebenermaßen bash, nicht sh, wie der Shebang nahelegt. Aus der Verwendung Großgeschriebener Bezeichner ergibt sich aber noch nicht, dass man eine tatsächlich verwendete Variable trifft - die Chancen sind, env | wc -l liefert mir 47 - mit 3 Zeichen kann man alleine 27**3 Kombinationen bilden, (wie mir
| env | sed 's/=.*//' | tr -d "\n" | sed 's/./& /g' | tr " " "\n" | sort -u
|
verrät werden die Zeichen A-Z und _ verwendet)
Chancen da zufällig was zu treffen sind also klein. Dazu kommt, dass die meisten Kollisionen überhaupt keine Auswirkung haben werden. Im Skript verwendet man die meisten Variablen nicht - sonst würde man sie ja kennen, und die eigenen anders benennen - außerhalb ist aber das, was man im Script getan hat, wieder vergessen. Wie es zu Problemen kommen soll - dazu würde mich mal ein möglichst plausibles Beispiel interessieren.
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Ich glaub, das ist eine Frage der Konvention. POSIX erklärt:
Environment variable names used by the utilities in the Shell and Utilities volume of POSIX.1-2008 consist solely of uppercase letters, digits, and the <underscore> ( '_' ) from the characters defined in Portable Character Set and do not begin with a digit. Other characters may be permitted by an implementation; applications shall tolerate the presence of such names. Uppercase and lowercase letters shall retain their unique identities and shall not be folded together. The name space of environment variable names containing lowercase letters is reserved for applications. Applications can define any environment variables with names from this name space without modifying the behavior of the standard utilities.
(aus: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html)
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
track schrieb: Möglicherweise ist es das schon, ansonsten müsstest Du mal verraten, wie Du das Skript in der Shell genau ausführst (und in welcher Shell), und unter welchem Dateimanager es laufen soll.
Ja, nenn mal die Umgebung, in der Du das Skript per Mausklick ausführen willst
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
user unknown schrieb: ... Wie es zu Problemen kommen soll - dazu würde mich mal ein möglichst plausibles Beispiel interessieren.
Ein besonders hübsches Beispiel hatten wir mal hier ... 😉 D630: Danke für den Link auf den POSIX- Abschnitt ! Bisher hatte ich nur Sekundärquellen gefunden, die mir dann gerne als "Privatmeinung" zerrissen wurden. Es gibt sie also doch, die höchst amtliche Regelung. 😀 Danke ! LG, track
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Genaugenommen, besagt der Abschnitt aber ja nur (?!), dass kleingeschriebene Environment-Variablen für Applikationen (=non-shell-utilities) reserviert sein sollen, bzw. anders gesagt: Wenn eine Applikation eine Variable in das Environment aufnehmen will/Teil davon werden soll, sollte dessen Name kleingeschrieben sein. Man könnte also erstmal herausfinden, was eine Environment-Variable ist, bzw. was "Einvironment" bedeutet, und inwiefern das Environment in einem Shell-Skript beeinflusst werden kann... – Ich persönlich verwende uppercase-Namen für Environment-Variablen trotzdem, wenn ich eine Applikation/ein Skript schreibe, das für mich selbst den Stellenwert eines Shell-Utility hat. Wenn ich eigene Environment-Variablen setzen will, die keinen direkten Bezug haben zu einer Applikation, präfixe ich es mit X_ . Zb wie hier bzw. hier
|
ClaasM
(Themenstarter)
Anmeldungsdatum: 4. November 2006
Beiträge: 323
|
D630 schrieb: track schrieb: Möglicherweise ist es das schon, ansonsten müsstest Du mal verraten, wie Du das Skript in der Shell genau ausführst (und in welcher Shell), und unter welchem Dateimanager es laufen soll.
Ja, nenn mal die Umgebung, in der Du das Skript per Mausklick ausführen willst
Danke für den Hinweis bezüglich der kleingeschriebenen variablen, ich werde es gleich mal ausprobieren. Mein OS ist elementaryOS 0.2 (Ubuntu 12.04 Basis; 64bit), die Shell nennt sich "Pantheon Terminal" (Rechtsklick innerhalb des Terminals und dann 'über' wählen; vermutlich ein gnome-terminal fork). Dort rufe ich das script ganz normal via sh create_..._.sh auf und macht dort fehlerfrei seinen Dienst.
Mein Dateimanager ist "pantheon-files" (keine Ahnung wovon er abstammt) und dort klicke ich ganz normal auf die ausführbare Datei.
Inzwischen habe ich herausgefunden, dass das Script bei Klick nur funktioniert, wenn der Dateimanager über die Shell aufgerufen wird. Öffne ich den Dateimanager "normal" über ein Icon passiert nichts.
|
TausB
Anmeldungsdatum: 26. November 2009
Beiträge: 1563
Wohnort: Terra incognita
|
ClaasM schrieb: Mein OS ist elementaryOS 0.2 (Ubuntu 12.04 Basis; 64bit), ...
... Mein Dateimanager ist "pantheon-files" (keine Ahnung wovon er abstammt) und dort klicke ich ganz normal auf die ausführbare Datei.
Diese Information hätte ich von Dir von Anfang an erwartet. Bin raus.
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Hm, ich schätze, damit wird sich keiner auskennen. Die Suchmaschine sagt: Pantheon Files sei ein sexy Fork von Marlin , und wird hier entwickelt. PS: Als einziger Tipp von mir: Versuch mal in "list view"/"grid view"/"columns view" zu wechseln und jeweils das Skript per Klick auszuführen...
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
ClaasM schrieb: Mein OS ist elementaryOS 0.2 (Ubuntu 12.04 Basis; 64bit), die Shell nennt sich "Pantheon Terminal" (Rechtsklick innerhalb des Terminals und dann 'über' wählen; vermutlich ein gnome-terminal fork). Dort rufe ich das script ganz normal via sh create_..._.sh auf und macht dort fehlerfrei seinen Dienst.
Der 1. Verdächtige ist sh ... das ist nämlich üblicherweise eine Weiterleitung , entweder auf die dash oder auf die bash (was nicht ganz egal ist !) Frag mal mit file $(which sh) ab, wohin das bei Dir verlinkt ist, und ruf dann den selben Befehl auch aus Deinem Dateimanager aus auf. (sinnigerweise mit Dateiumleitung in eine Log-Datei) Mein Dateimanager ist "pantheon-files" (keine Ahnung wovon er abstammt) und dort klicke ich ganz normal auf die ausführbare Datei.
Da müsstest Du mal in der Doku heraus kriegen, ob der ganz normal Befehle akzeptiert, oder ob es da noch Besonderheiten gibt. Eine 2. Frage ist, wie dort das Environment aussieht. Du kannst es ja mal mit env > environment.log abfragen und mit dem Desktop vergleichen. Inzwischen habe ich herausgefunden, dass das Script bei Klick nur funktioniert, wenn der Dateimanager über die Shell aufgerufen wird. Öffne ich den Dateimanager "normal" über ein Icon passiert nichts.
Das könnte ein Hinweis auf das Environment sein. Wie gesagt: am besten systematisch testen. LG, track
|
ClaasM
(Themenstarter)
Anmeldungsdatum: 4. November 2006
Beiträge: 323
|
track schrieb: Der 1. Verdächtige ist sh ... das ist nämlich üblicherweise eine Weiterleitung , entweder auf die dash oder auf die bash (was nicht ganz egal ist !) Frag mal mit file $(which sh) ab, wohin das bei Dir verlinkt ist, und ruf dann den selben Befehl auch aus Deinem Dateimanager aus auf. (sinnigerweise mit Dateiumleitung in eine Log-Datei) Mein Dateimanager ist "pantheon-files" (keine Ahnung wovon er abstammt) und dort klicke ich ganz normal auf die ausführbare Datei.
Da müsstest Du mal in der Doku heraus kriegen, ob der ganz normal Befehle akzeptiert, oder ob es da noch Besonderheiten gibt. Eine 2. Frage ist, wie dort das Environment aussieht. Du kannst es ja mal mit env > environment.log abfragen und mit dem Desktop vergleichen. Inzwischen habe ich herausgefunden, dass das Script bei Klick nur funktioniert, wenn der Dateimanager über die Shell aufgerufen wird. Öffne ich den Dateimanager "normal" über ein Icon passiert nichts.
Das könnte ein Hinweis auf das Environment sein. Wie gesagt: am besten systematisch testen.
Ahoi track,
danke für Deine Tips. sh verlinkt auf die dash:
claas@claas-ThinkPad-T400:~$ file $(which sh)
/bin/sh: symbolic link to `dash'
claas@claas-ThinkPad-T400:~$ Was meinst Du mit "environment abfragen und mit Desktop vergleichen"? Meine Ausgabe von env im Terminal sieht aus wie folgt:
claas@claas-ThinkPad-T400:~$ env
SSH_AGENT_PID=3049
GPG_AGENT_INFO=/tmp/keyring-qyuXCp/gpg:0:1
SHELL=/bin/bash
TERM=xterm
XDG_SESSION_COOKIE=075fbc5776b61b0749cfd3a300000003-1413653556.205324-2099783335
GNOME_KEYRING_CONTROL=/tmp/keyring-qyuXCp
USER=claas
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
SSH_AUTH_SOCK=/tmp/keyring-qyuXCp/ssh
DEFAULTS_PATH=/usr/share/gconf/pantheon.default.path
SESSION_MANAGER=local/claas-ThinkPad-T400:@/tmp/.ICE-unix/3017,unix/claas-ThinkPad-T400:/tmp/.ICE-unix/3017
XDG_CONFIG_DIRS=/etc/xdg/xdg-pantheon:/etc/xdg
PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
DESKTOP_SESSION=pantheon
PWD=/home/claas
GNOME_KEYRING_PID=3006
LANG=de_DE.UTF-8
MANDATORY_PATH=/usr/share/gconf/pantheon.mandatory.path
GDMSESSION=pantheon
SHLVL=1
HOME=/home/claas
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=claas
XDG_DATA_DIRS=/usr/share/pantheon:/usr/local/share/:/usr/share/
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-eVMMMCGiIf,guid=de534f2c43da512b99759e4900000010
LESSOPEN=| /usr/bin/lesspipe %s
DISPLAY=:0
XDG_CURRENT_DESKTOP=Pantheon
LESSCLOSE=/usr/bin/lesspipe %s %s
XAUTHORITY=/home/claas/.Xauthority
_=/usr/bin/env
claas@claas-ThinkPad-T400:~$ Könnte der Hund darin begraben liegen, dass sh auf dash verweist aber die shell auf bash?
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
ClaasM schrieb: Könnte der Hund darin begraben liegen, dass sh auf dash verweist aber die shell auf bash?
Glaube ich nicht, denn Du hast Dein Skript ja ausdrücklich mit sh (= dash ) aufgerufen. Die Frage ist, ob Dein Skript die selbe Umgebung sieht, wenn es vom "Pantheon File Manager" aus aufgerufen wird. Setz doch mal solche 2 Zeilen an den Anfang Deines Skripts, und guck danach, was nachher im logfile.txt steht: env > logfile.txt
file $(which sh) >> logfile.txt So meinte ich das mit dem vergleichen ... LG, track
|