ubuntuusers.de

Probleme mit Nautilus Skript & Leerzeichen

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Mokkujin

Anmeldungsdatum:
2. Mai 2008

Beiträge: 389

Wohnort: Hannover

Hallo ihrs,

ich hab ein kleines Skript für Nautilus geschrieben das mit Ordnerübergreifend eine Slideshow zusammen baut.

das funktioniert auch nur hab ich jetzt 2 kleine Probleme bei dennen ihr mir helfen könnten ☺

1.) Wenn ein Leerzeichen im Datei-/Pfadnamen ist kommt eog mit einer Fehlermeldung hoch ich denke das müsste man irgendwie maskieren , meine versuche mit sed sind in die Hose gegangen

2.) Das funzt auch nicht DUMMY=$(zenity --question --text="Soll die Slideshow im Vollbildmodus ausgeführt werden ?") lt. Manpage wird eine 1 oder 0 zurückgeliefert hab jetzt nach wirklich allen Möglichkeiten verglichen die mir bekannt sind "-eq = ==" usw. aber die Variable FLS ist immer TRUE , kann mir das mal bitte einer erklären ich bin am verzweifeln

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash
#
# Skript startet eine rekusive Diashow die Anzahl der enthaltenen Bilder und Ordner ist dabei egal
# ----------------------------------------------------------------------------------------------------
#

PICPATH="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"

SEC_SHOW=$(zenity --scale --max-value=60 --min-value=1 --value=3)

DUMMY=$(zenity --question --text="Soll die Slideshow im Vollbildmodus ausgeführt werden ?")

if [ $DUMMY -eq 0 ];then
	FLS=FALSE
else
	FLS=TRUE
fi

zenity --info --text "$FLS"

zenity --info --text "Die Slideshow wird im Pfad $PICPATH gestartet , die Anzeigedauer beträgt $SEC_SHOW Sekunden" --title "Slideshow wird gestartet"


if (test -d $PICPATH); then
	for FILE in $(find $PICPATH -type f | sort ); do
		FILENAME=$(basename $FILE)
		EXTENSION=${FILENAME:(-3)}
			if [ ${EXTENSION,,} == 'jpg' -o ${EXTENSION,,} == 'png' ]; then
						  if [ $FLS == 'FALSE' ];then
						  	#$(eog "$FILE") & $(sleep $SEC_SHOW)
						  else
						  	#$(eog -f "$FILE") & $(sleep $SEC_SHOW)
						  fi
						 # PIDEOG=$(pidof eog)
						 # $(kill $PIDEOG)
			fi
	done
else
zenity --error --text="Pfad wurde negativ überprüft \n\n $PICPATH" --title "Pfad Problem"
fi

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Du könntest

1
	FILENAME=$(basename "$FILE")

probieren.

Du rückst übrigens falsch ein. Ein if-Statement wird nicht selbst eingerückt, denn der Test findet ja auf jeden Fall statt:

1
2
3
4
5
6
7
richtig:
    // ...
    if ...

nicht so richtig:
    // ...
        if ...

Teilweise rückst Du es sogar mit 2 Tabs ein.

Codekürzung:

1
2
3
4
for FILE in $(find $PICPATH -type f | sort ); do
	FILENAME=$(basename "$FILE")
	EXTENSION=${FILENAME:(-3)}
	if [ ${EXTENSION,,} == 'jpg' -o ${EXTENSION,,} == 'png' ]

Wieso nicht so:

1
for FILE in $(find $PICPATH -type f -name "*.jpg" -o -name "*.png" | sort ); do

oder noch einfacher - allerdings geht das 'sort' verloren:

1
eog -s $PICPATH/*.png $PICPATH/*.png 

DUMMY/FLS muss ich noch testen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

--question gibt nichts aus, sondern etwas zurück. Der Rückgabewert muss mit $? abgefangen werden:

1
2
3
4
5
zenity --question --text="Soll die Slideshow im Vollbildmodus ausgeführt werden ?"
DUMMY=$?
if [[ DUMMY ]] ; then  FULLSCREEN="-f" ; else FULLSCREEN=""; fi
// ...
eog $FULLSCREEN -s $PICPATH/*.png $PICPATH/*.png 

Mokkujin

(Themenstarter)

Anmeldungsdatum:
2. Mai 2008

Beiträge: 389

Wohnort: Hannover

Danke user unknow hab deine Vorschläge mit eingebaut , allerdings hatte ich scheinbar einen denkfehler drin...

wenn ich bei zenity Ja drücke bekomme ich 0 zurück mit Nein 1 ?!? Naja habs jetzt so angepasst und es funktioniert

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
#
# Skript startet eine rekusive Diashow die Anzahl der enthaltenen Bilder und Ordner ist dabei egal
# ----------------------------------------------------------------------------------------------------
#

PICPATH="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"

SEC_SHOW=$(zenity --scale --max-value=60 --min-value=1 --value=3)

DUMMY=$(zenity --question --text="Soll die Slideshow im Vollbildmodus ausgeführt werden ?")

# zenity --info --text $?

if [ $? == '0' ] ; then  FULLSCREEN="-f" ; else FULLSCREEN=""; fi

zenity --info --text "Die Slideshow wird im Pfad $PICPATH gestartet , die Anzeigedauer beträgt $SEC_SHOW Sekunden" --title "Slideshow wird gestartet"


if (test -d $PICPATH); then
	for FILE in $(find $PICPATH -type f -name "*.jpg" -o -name "*.png" -o -name "*.JPG" | sort ); do
		FILENAME=$(basename $FILE)
		EXTENSION=${FILENAME:(-3)}
		$(eog $FULLSCREEN "$FILE") & $(sleep $SEC_SHOW)
		PIDEOG=$(pidof eog)
		$(kill $PIDEOG)
	done
else
zenity --error --text="Pfad wurde negativ überprüft \n\n $PICPATH" --title "Pfad Problem"
fi

das mit den Leerzeichen im Namen funktioniert leider immer noch nicht , hast du zufällig noch eine andere Idee ?

Mokkujin

(Themenstarter)

Anmeldungsdatum:
2. Mai 2008

Beiträge: 389

Wohnort: Hannover

TATA hab auf einer Seite was gefunden so funktionierts , weiß nur nicht obs die sauberste Lösung ist 😉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
#
# Skript startet eine rekusive Diashow die Anzahl der enthaltenen Bilder und Ordner ist dabei egal
#
# Source : Mokkujin
#
# Danke an "user unknown" für die Tipps 
# ----------------------------------------------------------------------------------------------------
#
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

PICPATH="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"


SEC_SHOW=$(zenity --scale --max-value=60 --min-value=1 --value=3)

DUMMY=$(zenity --question --text="Soll die Slideshow im Vollbildmodus ausgeführt werden ?")

# zenity --info --text $?

if [ $? == '0' ] ; then  FULLSCREEN="-f" ; else FULLSCREEN=""; fi

zenity --info --text "Die Slideshow wird im Pfad $PICPATH gestartet , die Anzeigedauer beträgt $SEC_SHOW Sekunden" --title "Slideshow wird gestartet"


if (test -d $PICPATH); then
	for FILE in $(find $PICPATH -type f -name "*.jpg" -o -name "*.png" -o -name "*.JPG" | sort ); do
		FILENAME=$(basename $FILE)
		EXTENSION=${FILENAME:(-3)}
		$(eog $FULLSCREEN "$FILE") & $(sleep $SEC_SHOW)
		PIDEOG=$(pidof eog)
		$(kill $PIDEOG)
	done
else
zenity --error --text="Pfad wurde negativ überprüft \n\n $PICPATH" --title "Pfad Problem"
fi

IFS=$SAVEIFS

http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Dies mit jpg und JPG:

1
find $PICPATH -type f -name "*.jpg" -o -name "*.png" -o -name "*.JPG"

läßt sich eleganter mit iname lösen:

1
find $PICPATH -type f -iname "*.jpg" -o -iname "*.png"

Was 'ignorierend-die-Groß/Kleinschreibung-des-Namens' bedeutet, und auch 'pNg' usw. erfaßt.

Den Unterschied zw. Deinen letzten 2 Versionen sehe ich nicht, was ist denn da anders? Achso - IFS. Ich hätte es mit

1
2
for FILE in $(find $PICPATH -type f -name "*.jpg" -o -name "*.png" -o -name "*.JPG" | sort ); do
	FILENAME=$(basename "$FILE")

versucht, für den Fall, dass so eine FILE Blanks enthält.

1
	EXTENSION=${FILENAME:(-3)}

erscheint mir auch suboptimal, falls Du mal .jpeg-Dateien in die Finger bekommen solltest.

1
EXTENSION=${FILENAME/*./} 

Nautilus starte ich ungern, deshalb teste ich auch ungern das ganze Script.

Ich frage mich ja, ob /home/mokkujin/.gconf/apps/eog/full_screen/%gconf.xml, welches bei mir

1
2
3
4
5
<?xml version="1.0"?>
<gconf>
        <entry name="seconds" mtime="1242303075" type="int" value="2">
        </entry>
</gconf>

enthält, einfach so geändert werden kann, dass statt value="2" da Deine Pausezeit einmal eingetragen wird, und dann alle Bilder auf einen Schwung an eog übergeben werden.

Bei 100 Bildern 100x kill aufzurufen ist nicht elegant.

Mokkujin

(Themenstarter)

Anmeldungsdatum:
2. Mai 2008

Beiträge: 389

Wohnort: Hannover

Ok es ist nicht elegant , ich habe auch nicht den Anspruch das ich alles weiß 😉 Ich muss nur für einen Kunden eine Slideshow realisieren die mit mehreren Ordnern & Unterordnern klar kommt. Er will es unbedingt mit eog machen da hab ich das Skript zusammengestöpselt 😉 wie würdest du das denn realisieren wenn du diese Struktur hast

1
2
3
4
Bilder ------> Produkt 1
          |--> Produkt 2
          |--> Produkt 3 -----> Artikel 1
                            |-> Artikel 2

usw...

der Fotograf schmeißt alles in die Ordner rein ( raw tiff usw. ) deswegen schau ich auch im Skriot nach png bzw jpg Dateien , das ganze Skript ist quasi nur deswegen entstanden weil ich keine Möglichkeit gefunden habe in eog einen Ordner mit allen Unterordnern und deren enthaltenen Dateien in der Slideshow anzuzeigen, ich bin gerne für Vorschläge offen 😉

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Aha, Kunde, das ändert manches.

Das erschwert ja oft die Kommunikation, weil man diskret sein muss, nicht vorschlagen kann alles ganz anders zu machen, vielleicht nicht alles nachfragen kann, und eher bereit ist mit einer weniger guten Lösung zu leben, wenn jmd. anderes - der Kunde - die Verantwortung trägt.

Und die Kommunikation wird natürlich erschwert, wenn eine Art stille Post entsteht - ich frage Dich, Du fragst den Kunden, der Kunde antwortet Dir, Du mir - ...

Wenn Du selbst der Fotograf wärst, würde ich fragen, ob Du RAW und tiff nicht sehen willst, und ob eog das nicht kann.

Mehrere Ordner mit png-Dateien kann man so an eog übergeben:

1
eog test/*/*png *.png a/b/*.png

mit mehreren Dateiendungen:

1
eog test/*/*{png,jpg,JPG} *.{png,jpg,JPG} a/b/*.{png,jpg,JPG}

ökonomischer kombiniert:

1
eog {test/*,.,a/b}/*.{png,jpg,JPG}

Mokkujin

(Themenstarter)

Anmeldungsdatum:
2. Mai 2008

Beiträge: 389

Wohnort: Hannover

Also das sollte jetzt keine faule Ausrede von mir sein 😉

Ich hab mir jetzt Gedanken gemacht ich werde deine Vorschläge mit einbauen , und in einer Schleife nur die Ordnernamen ermitteln 😉

eog kann tiff ok aber kann eog auch RAW ? bei mir zumind. nicht , ich hab die nur deswegen ausgeschlossen weil das laden in eog von einer tiff Datei die Slideshow kaputt macht zumind. die Zeit es dauert mitunter sehr lange bis so eine große Tiff Datei geladen wird , das vielleicht nur zur Erklärung. Die Kiste auf der das Skript laufen soll ist auch nicht die beste 1,2 GHZ mit 512 MB RAM , deswegen arbeite ich auch soviel mit kill da die Systemlast in diesem Fall nicht so hoch ist , wie das ich die Slideshow von eog verwende ...

Ich werd das Skript nochmal überarbeiten und überlegen wie man es besser machen kann , gute Kritik hast du mir geliefert , danke dafür 😉

Antworten |