Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Software>Praktisches shell script, um metadaten aus png und jpg zu entfernen - Wie für File-Patterns?

Praktisches shell script, um metadaten aus png und jpg zu entfernen - Wie für File-Patterns?

fluppy
fluppy07.04.1212:45
Hi,

ich versuche gerade, ein Shellskript zu basteln, welches die Metadata aus jpgs und pngs entfernt (gut für Webseiten, spart Platz).

Das funktioniert auch soweit, dass es für eine einzige Datei funktioniert. Nicht aber für Pattern wie *.png. Was muss ich ändern, damit das Script sich für alle gematchten Dateien des Patterns wiederholt?

Script:
#!/bin/sh
for f in $1
do
    if [[ $f == *.png ]]
        then
        pngcrush -reduce -rem tEXt -rem iTXt $f _stripped-$f
        cp -f _stripped-$f $f
        rm _stripped-$f
    fi
    if [[ $f == *.jpg ]]
        then
        jhead -purejpg $f
    fi
done

0

Kommentare

lenn1
lenn107.04.1213:29
Das $1 Argument ist nur ein einzelner String.
Daher wird es immer nur 1 Schleifendurchlauf geben.

Habs damit mal kurz getestet:

#!/bin/sh
for f in $1
do
echo Hallo Welt
done

Hab noch nie Bash Skripte geschrieben, denke aber du musst erstmal eine Liste von allen *.jpg anlegen, wenn du "*jpg" als $1 Argument hast.
0
Marcel Bresink07.04.1213:56
Die richtige Lösung wäre etwas wie

#!/bin/sh
for i
do
if [ `file -b $i | head -c 3` == PNG ]
then
pngcrush -reduce -rem tEXt -rem iTXt $i _stripped-$i
cp -f _stripped-$i $i
rm _stripped-$i
elif [ `file -b $i | head -c 4` == JPEG ]
then
jhead -purejpg $i
fi
done
0
_mäuschen
_mäuschen07.04.1214:40


#!/bin/sh
for i in $*
do
if [ `file -b $i | head -c 3` == PNG ]
then
pngcrush -reduce -rem tEXt -rem iTXt $i _stripped-$i
cp -f _stripped-$i $i
rm _stripped-$i
elif [ `file -b $i | head -c 4` == JPEG ]
then
jhead -purejpg $i
fi
done

0
Marcel Bresink07.04.1215:03
_mäuschen
Mein Original-Skript ist schon richtig. Diese Elemente darf man weglassen.
0
_mäuschen
_mäuschen07.04.1216:16

Ist aber schöner anzusehen

0
Igor Detlev07.04.1217:21
Mädchen nehmen das hier: http://imageoptim.com/
0
someone07.04.1218:49
Und wenn es auch mit Filenamen welche Leerzeichen enthalten funktionieren soll, dann muss man "$@" anstelle von $* schreiben und alle Argumente mit $i quoten.
Zumindest ist das mit der Linux bash shell so.
Bem.: [[ anstelle von [ ist auf Linux ebenfalls besser, da es nebst dem Shell-builtin auch /usr/bin/[ gibt.

#!/bin/sh
for i in "$@"
do
if [[ `file -b "$i" | head -c 3` == PNG ]]
then
pngcrush -reduce -rem tEXt -rem iTXt "$i" "_stripped-$i"
mv -f "_stripped-$i" "$i"
elif [[ `file -b "$i" | head -c 4` == JPEG ]]
then
jhead -purejpg "$i"
fi
done
0
fluppy
fluppy10.04.1210:06
Wow coole Sache, danke an Euch.

Rekursive Anwendung geht dann natürlich auch, oder? z.B.

stripimg -R ./*
?
0
Doebldodl10.04.1211:57
Rekursiv wäre eher sowas

$ find . -name '*.jpg' -exec stripimg {} \;

wobei "stripimg" der Name des ausführbaren Skriptes ist. "find" sucht ausgehend vom angegebenen Verzeichnis (hier das aktuelle, ".") alle Dateien mit einem gewissen Namen (hier "*.jpg") und wendet das angegebene Kommando darauf an.
0
_mäuschen
_mäuschen10.04.1213:15


Der geht dann auch gleich in sub folders Gefährlich



Besser wäre noch eine maximale Ordnertiefe

find . -name '*.jpg' -maxdepth 1 -exec ls {} \;

0
sierkb10.04.1213:33
Doebldodl
Rekursiv wäre eher sowas

$ find . -name '*.jpg' -exec stripimg {} ;

Betreffend der veralteten Bash 3.2.48, so wie sie unter MacOSX zum Einsatz kommt (steht noch unter der GPL2, deshalb von Apple bedenkenlos verwendet).
Mit der neueren, aktuelleren Bash 4.x (steht mittlerweile unter der GPL3, weshalb Apple einen Bogen um jegliche GNU-Software macht, welche die GPL3 statt der GPL2 einsetzt), ginge das auch nochmal kürzer, weil es seit der Bash 4 eine geniale neue Globbing/globstar-Funktionalität als Shell-Option gibt, welche neben zahlreichen anderen Verbesserungen u.a. auch deutlich einfachere, kürzere Rekursiv-Konstrukte erlaubt und ermöglicht als das bisher unter der in MacOSX noch eingesetzten Bash 3.x der Fall ist.

Die Bash 4 kann/könnte man sich zusätzlich z.B. via MacPorts (sudo port install bash) nach /opt/local/bin/bash installieren. Oder von Hand va Tarball nach /usr/local/bin/bash.

Siehe dazu u.a. auch:

stackoverflow: Bash: what expands to all files in current directory recursively

controlc.de: MacOSX Lion und die aktuelleste Bash-Shell

controlc.de: OSX und die Shell

Concision and Concinnity: Upgrade bash to 4.0 in Mac OS X

Bash News

Bash Hackers Wiki: Bash 4 - a rough overview
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.