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

  • From: Shinsan Hattori <hattorishinsan@xxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Sun, 4 Jan 2015 01:12:13 +0100

Il 2 gennaio 2015 23:59, Flavio Stanchina <flavio@xxxxxxxxxxxxx> ha scritto:
> On 02/01/2015 15:31, Shinsan Hattori wrote:
>> Per la parte di conversione/downscale delle immagini non
>> ho avuto problemi, mentre la componente di "sincronia" tra le due
>> cartelle risulta piuttosto complessa.
>
> Credo che chi ti ha dato suggerimenti non abbia letto questa frase.

In effetti... Già usavo imagemagick, anche se non la funzione
mogrify... Visto che mi par di capire che cose già fatte non ce n'è e
quindi tocca mettersi a sistemare lo script me la studio, vedi mai che
risolva qualche problema...

Il 3 gennaio 2015 00:44, Antonio Galea <antonio.galea@xxxxxxxxx> ha scritto:
> Ciao,
> io terrei monitorata la cartella principale con inotifywait. Ad ogni
> evento close_write lancerei lo script per riscalare le immagini, che
> produce il suo output in una diversa cartella sulla stessa macchina.
Anche questo è da vedere... Mi par di capire che dovrebbe avere il
vantaggio di non passare per cron e di non dover fare la comparazione
tra le due cartelle. Il dubbio è il tipo di output che close_write
produce, in particolare se è possibile fare in modo che lo script
agisca diversamente se si tratta di rimozione/modifica/aggiunta di
file immagine/file di altro tipo/sottocartelle. Se così non fosse
tocca di nuovo far fare allo script la comparazione delle directory,
giusto?

> Questa cartella la renderei visibile via rete sul RaspberryPI - con
> sshfs o Samba o NFS, così non hai bisogno di spostare nulla.
Certo, questo era previsto fin dall'inizio, non l'ho evidenziato
troppo nella spiegazione perché mi sembrava un elemento tutto sommato
secondario.

Il 2 gennaio 2015 23:59, Flavio Stanchina <flavio@xxxxxxxxxxxxx> ha scritto:
> Però, se vuoi qualche consiglio mirato, dovresti raccontarci nel dettaglio
> come hai implementato lo script e quali sono le difficoltà che hai incontrato.
Come ho detto, volevo prima verificare che fosse necessario, in modo
da non ammorbare il mondo con il mio codice schifido... Per chiarezza
di lettura lo script lo metto in allegato, spero non sia contrario a
qualche regola di netiquette... Altrimenti sgridatemi pure, vedi mai
che imparo...

Dunque, lo schema dovrebbe essere il seguente:

*diff tra directory_sorgente e directory_destinazione > individuo le
righe che indicano files presenti solo in directory_sorgente > salva
in .missing.txt
*diff tra directory_sorgente e directory_destinazione > individuo le
righe che indicano files presenti solo in directory_destinazione >
salva in .deleting.txt
*while (.missing.txt esiste e non è vuoto):
** per ogni riga ricava il nome del file e il percorso relativo
*** se il "nome file" è una directory
****crea la directory corrispondente in directory_destinazione
*** o se il "nome file" finisce in jpg
****convertilo
** aggiorna il contenuto di .missing.txt e .deleting.txt
*while (.deleting.txt esiste e non è vuoto):
** per ogni riga ricava il nome del file e il percorso relativo
** rimuovi il "nome file"
** aggiorna il contenuto di .deleting.txt
*elimina i files di supporto e termina lo script

Nel rileggere ora il codice mi sono accorto di alcuni punti in cui ci
sono operazioni inutili (tipo aggiornamenti del contenuto dei files di
supporto quando non c'è alcuna ragione per aggiornarli). A parte
questo, evidentemente la struttura deriva dalla mia ignoranza degli
strumenti di base (in particolare grep, sed, ed espressioni regolari).
Sto cercando di imparare qualcosa, lo script è il risultato attuale
dei miei sforzi. Diciamo che è il meglio che son riuscito a fare,
anche se son piuttosto sicuro che capendoci di più sia possibile
utilizzare delle soluzioni più precise (non degli accrocchi che
funzionano quasi solo nel caso specifico previsto in fase di testing).
I cicli while sono stati introdotti a causa di grep (o della mia
ignoranza dello stesso). In particolare non riesco ad ottenere un
output completamente ricorsivo: se in directory_sorgente ho "nuova
cartella" (assente in directory_destinazione) mi rileva solamente la
presenza di "nuova cartella", e non il suo contenuto. Di conseguenza,
per processare i jpg e le subdirectory eventualmente contenuti devo
prima creare directory_destinazione/nuova cartella, rifare il diff e
riprocessare l'output finché questo non risulta vuoto.
Il bug principale è dovuto proprio alla condizione impostata per il
ciclo while: se in directory_sorgente c'è qualcosa che non è né una
directory né un file di immagine riconosciuto dallo script questo
rimane lì (come è giusto che sia, in quanto nell'archivio possono fare
comodo i file esterni con i metadati, mentre nella cartella per il Pi
sarebbero superflui). Rimanendo lì, ricompare in .missing.txt ogni
volta che questo viene aggiornato, anche quando il lavoro dello script
sarebbe finito, sicché il ciclo va in loop infinito.
La soluzione "semplice" credo sia riuscire a trovare un'espressione
regolare che consenta di escludere a monte tutto quanto non è né
directory né jpg dal file .missing.txt, ma per i motivi di cui sopra
non ci sono ancora arrivato. Una versione più complessa potrebbe
essere cambiare la condizione al ciclo while (in modo che non si basi
più sul fatto che .missing.txt sia esistente e non vuoto) ma non mi
viene in mente una condizione più adeguata. Ovviamente si accetta ogni
tipo di suggerimento (anche riscrivere tutto secondo lo schema
proposto da Flavio).

Ringrazio tutti per i suggerimenti,
Nicola

Attachment: script_foto.sh
Description: Bourne shell script

Other related posts: