Newsgroup: it.comp.os.linux.iniziare
Titolo: aiuto script bash (tema hdr)

Ciao a tutti.
Sto scrivendo uno script bash che prende un'immagine raw situata nella 
cartella in cui viene lasciato, crea 7 immagini con esposizioni 
superiori e inferiori (tramite ufraw-batch) e le fonde con enfuse.
Lo script è questo:
ufraw-batch --exposure=0  --out-type=tif --output=0.tif  --overwrite *.ARW
ufraw-batch --exposure=-1 --out-type=tif --output=m1.tif --overwrite *.ARW
ufraw-batch --exposure=-2 --out-type=tif --output=m2.tif --overwrite *.ARW
ufraw-batch --exposure=-3 --out-type=tif --output=m3.tif --overwrite *.ARW
ufraw-batch --exposure=+1 --out-type=tif --output=p1.tif --overwrite *.ARW
ufraw-batch --exposure=+2 --out-type=tif --output=p2.tif --overwrite *.ARW
ufraw-batch --exposure=+3 --out-type=tif --output=p3.tif --overwrite *.ARW
enfuse -o image.tif *.tif
rm 0.tif
rm m1.tif
rm m2.tif
rm m3.tif
rm p1.tif
rm p2.tif
rm p3.tif
Ora, lo script funziona perfettamente se nella cartella c'è una sola 
immagine RAW (.ARW è il RAW di Sony).
Vorrei fare in modo che se nella cartella ci fossero 3 file:
primo.arw
secondo.arw
terzo.arw
lo script li processi uno ad uno e alla fine mi dia tre file elaborati
primo.arw
secondo.arw
terzo.arw
sapreste aiutarmi?
grazie a tutti!

 sapreste aiutarmi?
Devi usare un ciclo for e le variabili d'ambiente.
Una cosa un po' più carina che fa quel che chiedi (ma non funziona se i nomi
file delle immagini contengono spazi):
#!/bin/bash
for file in *.ARW
do
  for exp in -3 -2 -1 0 +1 +2 +3
  do
    ufraw-batch --exposure=${exp} --out-type=tif \
                --output=${file}_${exp}.tif --overwrite ${file}
  done
  enfuse -o $(basename ${file} .ARW).tif ${file}_*.tif
  rm ${file}_*.tif &> /dev/null
done
-- 
Flavio Visentin
Ubuntu in Zulu significa "Non so usare Debian". (cit. CtRiX)


azz... non è carina: è bellissima!!

 sapreste aiutarmi?
Prima di tutto accendi il cervello quando pensi, poi studia, 
studia ed ancora studia.
 
http://tldp.org/LDP/Bash-Beginners-Guide/
Poi se vuoi alcuni consigli:
 -  Processa solo un file alla volta; magari usa un ciclo.
 -  Genera i file temporanei usando mktemp.
 -  Effettua controlli prima di processare, cancellare o 
      sovrascrivere un file.
 -  Usa le virgolette
 -  Passa i file da processare come parametri dello script.
 -  Impara ad usare i comandi, in particolare rm
 -  Leggere i manuali *È* *OBBLIGATORIO*
Infine una considerazione: Gli errori che hai fatto c'entrano
 poco o punto con la bash; sono errori concettuali fatti 
perché non hai pensato a cosa volevi fare, a come dovevi 
farlo e a come dire al computer di fare cié che volevi.

 done
 
Salta sempre fuori 'sta storia degli spazi e il bello e` che manco me ne 
accorgo quando faccio delle prove perche` ho l'abitudine di salvare i file 
con dei nomi senza spazi.
Ho guardato esempi su Internet. Se ho capito bene si risolvebbe il 
problema degli spazi modificando il tuo script cosi`:
#!/bin/bash
OLDIFS=$IFS   # separatore: spazio
IFS=$'\n'     # separatore: a capo
fileArray=($(find *.ARW)) 
IFS=$OLDIFS   # restore del sepatarore a spazio
tLen=${#fileArray[@]}
for (( i=0; i<${tLen}; i++ ));
do
  for exp in -3 -2 -1 0 +1 +2 +3
  do
      ufraw-batch --exposure=${exp} --out-type=tif \
	  --output=${fileArray[$i]}_${exp}.tif --overwrite 
${fileArray[$i]}
  done
  enfuse -o $(basename ${fileArray[$i]} .ARW).tif ${fileArray[$i]}_*.tif
  rm ${fileArray[$i]}_*.tif &> /dev/null
done

M_M wrote:

Non funziona. Molto piu' semplicemente, basta mettere le variabili tra 
virgolette doppie.
-- 
Cio' che si vede, e'.

 
Non ho capito. Ad esempio come dovrei scrivere:


M_M wrote:


(non testato)


 (non testato)
E difatti non funziona cosě :-)
O metti caratteri di escape o fai due passaggi che č meglio. E poi non puoi
usare il for in quella forma per scegliere i files.
Personalmente farei due script, uno che faccia solo il merge e l'altro che
cicli per i files o che possa essere richiamato da un xargs o con i parametri.
#!/bin/bash
TMPDIR=`mktemp -d`
WRKDIR=`pwd`
for file
do
  OUT=$(basename "${file}" .ARW).tif
  for exp in -3 -2 -1 0 +1 +2 +3
  do
    echo ufraw-batch --exposure=${exp} --out-type=tif \
                --output=$TMPDIR/${exp}.tif --overwrite "$WRKDIR/${file}"
  done
  enfuse -o "$WRKDIR/$OUT" $TMPDIR/*.tif
  rm -r $TMPDIR &> /dev/null
done
(non testato) ;-)


 E difatti non funziona così :-)
Allora non ho capito come funziona enfuse :(  (e in effetti non l'ho mai 
usato).


Marco wrote:

Forse questo, se $file e' "abc.ARW":
enfuse -o "${file%.ARW}.tif" "${file%.ARW}"_*.tif 


 parametri.
O, meglio, fai un solo script a cui passare i file da processare come
argomenti (e che puo essere invocato con xargs, ma questo è irrilevan_
te) e cicla sui file e poi all'interno di questo una funzione che fa
il merge dei vari file.
Poi ti ricordo che  i file temporanei  devono essere  creati in /tmp, 
~/tmp o simili e devono avere nomi non prevedibili. Va bene usare una
directory temporanea ma o la usi per metterci i file temporanei o crei
anche i file temporanei con mktemp.

 anche i file temporanei con mktemp.
Cioè intendo dire che o fai tanti file temporanei o fai una sola 
directory temporanea come nel tuo esempio.