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.
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.