[Linuxtrent] Re: Script (o simile) di conversione automatica foto

  • From: Shinsan Hattori <hattorishinsan@xxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Thu, 8 Jan 2015 18:41:05 +0100

Il 6 gennaio 2015 01:40, Antonio Galea <antonio.galea@xxxxxxxxx> ha scritto:
> 2015-01-05 11:50 GMT+01:00 Flavio Stanchina <flavio@xxxxxxxxxxxxx>:
>> On 04/01/2015 02:38, Antonio Galea wrote:
>>>   for f in `find src/ -name \*.jpg`
>>>   do
>>>      [...]
>>
>> Passando gli argomenti in questo modo, prima o poi si incappa nel limite di
>> lunghezza della riga di comando. Usate
>>
>>   find src -name '*.jpg' | while read f; do ...
>>
>> ...che tra l'altro parallelizza (almeno in parte) l'operazione di lettura
>> della directory e l'effettiva elaborazione dei file.
>
> Ciao Flavio,
> grazie della utilissima puntualizzazione - nel caso in questione la
> tua versione è sicuramente necessaria, visto che le immagini possono
> essere molte migliaia.
>
> Anotnio
> --

Non ho capito bene quale fosse il problema della precedente
formulazione ma mi fido... Anche perché la forma proposta da Flavio
inizia a risolvere un bug che stavo cercando di estirpare da solo (per
ora senza successo): i files con spazi all'interno del nome. Mentre
inizialmente questi generavano due diversi valori per f, usando il
"find src -name '*.jpg' | while read f; do ..." questo non accade.
Tuttavia il problema si ripresenta al momento in cui viene chiamato
convert:

comando lanciato: convert src_2/PNG/DSC_57 74.png -filter Lanczos
-define filter:lobes=4 -resize 1920x1080\> dst_2/PNG/DSC_57 74.jpg
convert.im6: unable to open image `src_2/PNG/DSC_57': File o directory
non esistente @ error/blob.c/OpenBlob/2638.
convert.im6: no decode delegate for this image format
`src_2/PNG/DSC_57' @ error/constitute.c/ReadImage/544.
convert.im6: unable to open image `74.png': File o directory non
esistente @ error/blob.c/OpenBlob/2638.
convert.im6: unable to open file `74.png' @ error/png.c/ReadPNGImage/3667.
convert.im6: unable to open image `dst_2/PNG/DSC_57': File o directory
non esistente @ error/blob.c/OpenBlob/2638.
convert.im6: no decode delegate for this image format
`dst_2/PNG/DSC_57' @ error/constitute.c/ReadImage/544.
convert.im6: no images defined `74.jpg' @
error/convert.c/ConvertImageCommand/3044.

Da quel che ho visto in giro mi è parso di capire che per evitare
questo genere di problemi la cosa migliore è indicare le variabili
nella forma "${f}", ma sembra non bastare.

Nel frattempo avevo apportato un'altra modifica sostanziale. Non
fidandomi troppo dell'estensione (che potrebbe essere .jpeg .jpg .JPEG
.JPG...) ho provato a mettere in piedi un test basato sui mime-type.
Al che non c'era più nessuna ragione di limitarsi ai jpg come formato
sorgente, in quanto convert si occupa di salvare nel formato indicato
dall'estensione del file di destinazione (motivo per cui l'output
sopra mostra un file .png come input). Quel che ancora non ho risolto
è il test della data, che deve tener conto della possibile differente
estensione tra i due files (credo di poterci arrivare da solo, con un
po' di tempo e di voglia di fare esperimenti). Questo è quindi lo
stato attuale:

## Costanti ##
# imposta src e dst
src="src_2"
dst="dst_2"

## Funzioni ##
# Genera una versioen downscalata del file originale e si assicura che
l'output sia in jpeg
function resize_and_convert {
echo "comando lanciato: convert "${1}" -filter Lanczos -define
filter:lobes=4 -resize 1920x1080\> $(echo "${2}" | sed
's/\(.*\)\..*/\1.jpg/')"
# BUG: le variabili non vengono assate correttamente, i nomi di files
contenenti spazi generano errori
convert "${1}" -filter Lanczos -define filter:lobes=4 -resize
1920x1080\> $(echo "${2}" | sed 's/\(.*\)\..*/\1.jpg/')
}

# sincronizza l'albero directory
rsync -a --delete -f"+ */" -f"- *" "${src}"/ "${dst}"/

# individua tutti i files presenti nella cartella src. Poi se il mime-type
# corrisponde a image li converte chiamando resize_and_convert
find "${src}" -name '*.*' | while read f;
do
t="${dst}"${f#"${src}"}
type=$(file --mime-type "${f}" | sed 's/\(^.*\)\(: \)\(.*\)\(\/.*\)/\3/')
if [ "${type}" == "image" ]
then
## BUG: il controllo deve tener conto che il file di origine e
## quello di destinazione potrebbero non avere la stessa estensione
test "${f}" -nt  "${t}" && resize_and_convert "${f}" "${t}"
fi
done

# elimina i file presenti solo in dst/
for t in $(find "${dst}"/ -name \*.*)
do
f="${src}"${t#"${dst}"}
if [[ ! -s "${f}" ]]
then
if [[ "$(echo "${f#"${src}"}" | sed 's/\(.*\)\..*/\1/')" != "$(echo
"${t#"${dst}"}" | sed 's/\(.*\)\..*/\1/')" ]]
then
rm "${t}"
fi
fi
done

# sincronizza l'albero directory (necessario per far sparire le directory
# svuotate)
rsync -a --delete -f"+ */" -f"- *" "${src}"/ "${dst}"/


Il 5 gennaio 2015 18:46, Nicola Manica <nicola.manica@xxxxxxxxx> ha scritto:
> So che farò arrabbiare i puristi ma siccome sono pigro e se non ci sono
> problemi di spazio utilizzerei un repository git locale per "capire" le
> differenze (git status -s), così da fare la conversione dei soli file nuovi
> o modificati.
> Se non mi sfugge qualcosa l'unico caso particolare è l'aggiunta di directory
> che va gestito a parte

Grazie del suggerimento. Diciamo che per ora lo metto da parte, in
quanto anzitutto dovrei imparare a gestire git. Che male non fa, anzi,
prima o poi ci arriverò (spero), ma per ora non è tra le priorità :)
Se con lo script "semplice" non si procede, tenterò anche questa
via...
--
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: