PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : script mit Dateinamen mit Leerzeichen scheitert



pospiech
28-10-2009, 20:04
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?


#!/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.

jeebee
28-10-2009, 22:54
Das Problem ist, dass der for-loop die Leerzeichen als Input Field Separator betrachtet. Dies kannst du zum Beispiel umgehen, indem du folgendes machst:
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
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:
#!/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

pospiech
29-10-2009, 19:17
Danke, ich hatte gestern Abend mit viel Suchen und probieren mir eine ähnliche Lösung gebastelt. Hier jetzt der vollständige 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

Keeper
04-11-2009, 15:10
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:

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