Newsgroup: it.comp.os.linux.iniziare
Titolo: Nomi di file con spazi e ciclo for

Questo script rinomina i file nella directory corrente assegnando loro un 
nuovo nome, un numero progressivo e lasciando intatta l'estensione, utile
ad esempio per fare ordine tra le foto scaricate da una macchina digitale.
Funziona, ma non se i nomi originali contengono degli spazi: ho provato 
-nella riga con find- a usare sed per inserire un escape ( | sed 's/ /\\\ /g')
e con il quoting  (ls --quoting-style=shell), senza risultati.
Se qualcuno potesse dirmi come risolvere il problema...
Grazie,
franco ( franco [punto] mussano [at] tin [punto] it )
#!/bin/bash
#
# RINOMINANDO 1.2
# (c) 2003 Silvio Allari & Franco Mussano
#
# Questo script è rilasciato sotto la GNU Public License (GPL).
#
# Rinomina i file nella directory corrente con un <nuovonome> e un numero progressivo,
# lasciando intatta l'estensione.
#
# Uso: copiare lo script in una directory e inserirla nel PATH (oppure copiarlo
# -per esempio- in /usr/bin), renderlo eseguibile (chmod +x),
# portarsi nella directory contenente i file da rinominare e lanciarlo
#
# Sintassi: rinominando <nuovonome>    (es: rinominando vacanze)
#
# Utilità: ho un mare di foto delle vacanze e voglio fare ordine...
#
# Il numero progressivo comincia con un tot di zeri necessari a mantenere
# i nuovi nomi della stessa lunghezza (cioè vacanze_001.jpg -> vacanze_130.jpg,
# e non vacanze_1.jpg -> vacanze_130.jpg)
#
# TODO1 - non funziona con i nomi originali contenenti spazi (ho provato con
# il quoting e con sed, senza risultati...
# TODO2 - usa variabili invece di creare file
#crea un file in cui viene scritto uno zero (diventerà 1, poi 2, ecc...)
echo "0" > .piu_uno
# crea .righenomi, con la lista dei file della directory corrente
find ./ -name '*' -maxdepth 1 -type f | ls -tr > .righenomi
# conta i file e ne scrive la somma in .numero
cifre=`wc -l .righenomi | sed "s/.righenomi//"`
echo $cifre > .numero
# imposta la variabile nncifre (quante cifre avrà il numero progressivo)
ncifre=`wc -c .numero | sed "s/.numero//"`
nncifre=$[$ncifre-1]
# imposta il numero progressivo e rinomina i file
listafile=`cat .righenomi`
  for nomefile in $listafile
  do
    estensione=$(echo $nomefile | sed 's/\.\///' | sed 's/\(\<.*\)\.\(.*\)\>/\.\2/')
    number=$(cat .piu_uno)
    nnumber=$[$number+1]
    echo "$nnumber" > .piu_uno
    e=$(wc -c .piu_uno)
    nusate=$(echo $e | sed 's/\(\<[0-9]*\)*\(.*\)\>/\1/')
    nnusate=$[$nusate-1]
    if test $nnusate -lt $nncifre
    then zeri=$(echo -n 0)
      numzeri=$[$nncifre-($nnusate+1)]
      while test $numzeri -gt 0
      do
        zeri=$zeri$(echo -n 0)
        numzeri=$[$numzeri-1]
      done
      mv $nomefile $1_$zeri$nnumber$estensione
    else
      mv $nomefile $1_$nnumber$estensione
    fi
  done
# elimina i file che non servono più
rm -f .piu_uno .numero
shred -zu .righenomi

 Funziona, ma non se i nomi originali contengono degli spazi
Devi cambiare l'identificatore di fine campo IFS.
IFS='\n' dovrebbe fare al caso tuo. man bash per ulteriori info
Davide

 Davide
Grazie, vado subito a provare...
franco

   do
Dovrebbe funzionare facendo:
cat .righenomi | while read nomefile; do
P.S. Occhio che ad usare files a nome fisso (.righenomi, .piu_uno ecc...)
assicuri che il tuo script non funzionera` piu' se girato in copie multiple.
Meglio usare files del tipo /tmp/$$.righenomi, /tmp/$$.piu_uno eccetera.
Ciao
-- 
       Roberto Divia`             Love at first sight is one of the greatest
       =============             labour-saving devices the world has ever seen.
Mailbox: C02110                 CERN-European Organization for Nuclear Research
E-mail: 
Robert...@cern.ch
           CH-1211 GENEVE 23, Switzerland

 Ciao
E' vero, grazie per i consigli.
franco