Anzeige:
Ergebnis 1 bis 4 von 4

Thema: script mit Dateinamen mit Leerzeichen scheitert

  1. #1
    Registrierter Benutzer
    Registriert seit
    10.04.2005
    Ort
    Hannover
    Beiträge
    1.854

    script mit Dateinamen mit Leerzeichen scheitert

    Ich habe ein Skript das in einem Verzeichnis mit convert alle Bilder skaliert.
    Das funktioniert leider nur solange die Dateinamen keine Leerzeichen haben.

    Wie müßte ich das Skript nun anpassen, damit es die Dateinamen akzeptiert?
    Code:
    #!/bin/bash
    
    for file in $(ls -A *.[jJ][pP][gG]| grep -v web); 
    do 
    	file=$newfile
    	convertfile=`echo web.$file`
    	convert $file -geometry 750x750 $convertfile
    done
    Umbennen der Dateinamen ist keine mögliche Option.

  2. #2
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Das Problem ist, dass der for-loop die Leerzeichen als Input Field Separator betrachtet. Dies kannst du zum Beispiel umgehen, indem du folgendes machst:
    Code:
    find . -type -f -and -not -name '*web*' -print0 | while read -d $'\0' file; do; file=${file:2}
    Das find ist wohl auch effizienter als in einem ls -A nach einem pattern zu greppen. Danach gibst du die Argumente mit Nullbyte getrennt weiter und sagst read, dass die Argumente Null-Byte-getrennt sind. das file=${file:2} am Schluss schneidet noch das hier überflüssige ./ am Anfang jedes Resultats von find ab.

    Danach kannst du auch noch eine weitere Subshell loswerden, indem du
    Code:
    convertfile="web.${file}"
    verwendest.

    Zusätzlich brauchst du dann auch noch Anführungszeichen um die Variablen $file und $convertfile im convert-Aufruf, damit die bash dort die Leerzeichen als Teil des Dateinamens akzeptiert.

    Das Ganze könnte dann etwa so aussehen:
    Code:
    #!/bin/bash
    
    find . -type f -and -not -name '*web*' -print0 | while read -d $'\0' file;
    do
    	file=${file:2}
    	file=$newfile # was macht die Zeile genau? (Typo?)
    	convertfile="web.${file}"
    	convert "$file" -geometry 750x750 "$convertfile"
    done
    Geändert von jeebee (28-10-2009 um 23:56 Uhr)
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  3. #3
    Registrierter Benutzer
    Registriert seit
    10.04.2005
    Ort
    Hannover
    Beiträge
    1.854
    Danke, ich hatte gestern Abend mit viel Suchen und probieren mir eine ähnliche Lösung gebastelt. Hier jetzt der vollständige Code:

    Code:
    find . -not -iname "*web.*" -iname "*.jpg" | sed 's/.\///' | while read file ; 
    do 
    	# lcase 
    	newfile=$(echo "$file" | tr [A-Z] [a-z])	
    	if [ "$newfile" != "$file" ] 
    	then
    		mv "$file" "$newfile"
    	fi
    	file="$newfile"
    	convertfile=`echo web.$file`
    
    	convert "$file" -geometry 750x750 "$convertfile"
    done

  4. #4
    Registrierter Benutzer
    Registriert seit
    24.01.2005
    Beiträge
    23
    Falls du es noch nicht wusstet:

    Das Programm "mogrify", was ebenfalls zu ImageMagick gehört, macht das für dich; es wendet eine Option auf eine Menge von Dateien an.

    Beispiel:
    Code:
    mogrify -scale 750x750 *.jpg
    Und dein Problem wäre gelöst...

    Ich bin mir nicht sicher, aber ich glaube, dass "*.jpg" nicht case-sensitive ist. Falls doch, hängst du halt noch die [jJ] etc dran, aber das sollte ja kein Problem sein.

    Mfg Tim

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •