franco@aquila1
2003-12-07 17:47:39 UTC
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
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