Discussione:
Nomi di file con spazi e ciclo for
(troppo vecchio per rispondere)
franco@aquila1
2003-12-07 17:47:39 UTC
Permalink
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
Davide Bianchi
2003-12-07 17:50:35 UTC
Permalink
Post by ***@aquila1
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
franco@aquila1
2003-12-07 17:55:34 UTC
Permalink
Post by Davide Bianchi
Devi cambiare l'identificatore di fine campo IFS.
IFS='\n' dovrebbe fare al caso tuo. man bash per ulteriori info
Davide
Grazie, vado subito a provare...

franco
Roberto Divia
2003-12-08 13:52:43 UTC
Permalink
Post by ***@aquila1
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
[...]
Post by ***@aquila1
# imposta il numero progressivo e rinomina i file
listafile=`cat .righenomi`
for nomefile in $listafile
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: ***@cern.ch CH-1211 GENEVE 23, Switzerland
franco@aquila1
2003-12-08 17:19:20 UTC
Permalink
Post by Roberto Divia
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
E' vero, grazie per i consigli.

franco

Loading...