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