[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bilder-Batch



Hallo,

Am Don, 27 Aug 2009, Wolfgang Freitag-Friedl schrieb:
>David Haller schrieb:
>>Am Mit, 26 Aug 2009, Wolfgang Freitag-Friedl schrieb:
>[...]
>>>Ich dachte, wenn ich
>>>* die Ordnerstruktur dupliziere
>>>* Dateiliste in ein File einlese:
>>>find -name *jpg | cat >> /tmp/test
>>                  ^^^^^^^^ Weia. Das ist mal ein kreativer "Useless
>>                  use of cat".
>>
>>>* for i in $(cat < /tmp/test); do convert  -quality 85 -resample 96x96
>>           ^^^^^^^^^^^^^^^^^^^^
>>
>>Hier zerbröselt's dir schon. Besser ist bei sowas:
>>
>>while read file; do
>>    ...
>>done < Datei
>>
>>>-resize 1024x768 "$i" "/dev/shm/testuser/$(dirname $i)/$(basename $i)" ;
>>>done;                                              ^^             ^^
>>
>>und da wieder. Und wieso hier überhaupt dirname/basename?
>
>Äh, weil ich nur Amateur bin und nicht besonders fix bei scripts? :-)
>
>>find . -name '*.jpg' -print0 | while read -r -0 file; do
>>    convert -quality 85 -resample 96x96 -resize 1024x768 \
>>        "$file" "/dev/shm/testuser/${file%\/*}/${1##*\/}"
>>done
>
>Diese Variante habe ich ausprobiert (im Quellverzeichnis), meldet aber
>bash: read: -0: invalid option
>(Ich tippe, dass read diese Option mit dem nullbyte nicht mehr kennt)

*örks* Mein Fehler. Da war ich in Gedanken bei 'xargs'.

>metro@linux$ cat < /tmp/test | while read -r  file ; \
              ^^^^^^^^^^^^^^^^^ wieder sehr kreativ.

Verwende

    while .. ; do ... ; done < /tmp/test

oder wenigstens, wenn's unbedingt ein cat sein muß:

    cat /tmp/test | while .. ; do ... ; done

>do convert -quality  85 -resample 96x96 -resize 1024x768 \
>"$file"  \
>"/home/metro/PHOTOS_drop/$(dirname "$file")/$(basename "$file")" ; done
>
>(Die Variante mit ${file%\/*}/${1##*\/}" hat übrigens nicht geklappt)

Da hab ich auch gepennt. Muß natürlich ${file%\/*}/${file##*\/} sein.
Aber wenn du eh beides verwendest ist das komplett überflüssig und du
kannst direkt den kompletten Dateinamen verwenden (unten das "$1" in
"${thumbdir}/$1").

So müßte es klappen:

find . \( -iname '*.jpg' -o -iname  '*.jpeg' \) -exec sh -x -c '
    thumbdir="/dev/shm/testuser"
    echo "$1 -> ${thumbdir}/$1";
    dir="$(dirname "${thumbdir}/$1")";
    test -d "$dir" || mkdir -p "$dir";
    convert -quality 85 -resample 96x96 -resize 1024x768 \
        "$1" "${thumbdir}/$1"
    ' find-sh {} \;

Statt dem -exec sh -c '..' kannst du den Konvertierungskram in ein
extra-script schreiben und das dann aufrufen.

Ich gehe dabei davon aus, daß convert die Laufzeit des Scripts
dominiert, ansonsten könnte man auch das innere Script so umbauen, daß
es mehrere Dateinamen verarbeiten kann.

find ... -exec sh -c '
    thumbdir=...
    for file; do
        echo "$file -> ...";
        ...
        convert ... "$file" "${thumbdir}/${file}"
    done
    ' find-sh {} \+

>? kann ich find auch noch eine Art "oder" mitgeben bzw. etwas, damit 
>auch *jpeg gefunden wird?
>find . -name '*.jp[e]g'

Ungetestet:

    -regex '.*\.jpe?g'

Oder siehe oben.

-dnh

-- 
Klar, der Unterschied zwischen Zuvieldienstleistenden und den
Wehrdienstleidenden ist ja bekanntlich der, daß die Zivis mit
Tod und Sterben zu tun haben und die Soldaten davon nur erzählt
bekommen.                                   -- Markus Kaufmann


Reply to: