He sustituido la última línea:
Código:
mv $BASE.`expr $NUM - 1` $BASE.`printf "%02d" $NUM` && NUM=`expr $NUM - 1` ; done
por ésta (añadiéndole dos ceros):
Código:
mv $BASE.0*`expr $NUM - 1` $BASE.0`printf "%02d" $NUM` && NUM=`expr $NUM - 1` ; done
Con ello consigo que se renumeren los archivos como es deseado si no hay más de 10. Pero cuando hay más de 10, esto es lo que pasa:
Código:
usuario@usuario-desktop:~/Escritorio/aaa$ ./rem
+ read -p 'nombre base : ' BASE
nombre base : patos.flv
+ wc -l
+ ls patos.flv.000 patos.flv.001 patos.flv.002 patos.flv.003 patos.flv.004 patos.flv.005 patos.flv.006 patos.flv.007 patos.flv.008 patos.flv.009 patos.flv.010 patos.flv.011 patos.flv.012 patos.flv.013 patos.flv.014 patos.flv.015
++ cat numero
+ NUM=16
++ seq 1 16
+ for i in '`seq 1 $NUM`'
++ expr 16 - 1
++ printf %02d 16
+ mv patos.flv.015 patos.flv.016
++ expr 16 - 1
+ NUM=15
+ for i in '`seq 1 $NUM`'
++ expr 15 - 1
++ printf %02d 15
+ mv patos.flv.014 patos.flv.015
++ expr 15 - 1
+ NUM=14
+ for i in '`seq 1 $NUM`'
++ expr 14 - 1
++ printf %02d 14
+ mv patos.flv.013 patos.flv.014
++ expr 14 - 1
+ NUM=13
+ for i in '`seq 1 $NUM`'
++ expr 13 - 1
++ printf %02d 13
+ mv patos.flv.012 patos.flv.013
++ expr 13 - 1
+ NUM=12
+ for i in '`seq 1 $NUM`'
++ expr 12 - 1
++ printf %02d 12
+ mv patos.flv.011 patos.flv.012
++ expr 12 - 1
+ NUM=11
+ for i in '`seq 1 $NUM`'
++ expr 11 - 1
++ printf %02d 11
+ mv patos.flv.010 patos.flv.011
++ expr 11 - 1
+ NUM=10
+ for i in '`seq 1 $NUM`'
++ expr 10 - 1
++ printf %02d 10
+ mv patos.flv.009 patos.flv.010
++ expr 10 - 1
+ NUM=9
+ for i in '`seq 1 $NUM`'
++ expr 9 - 1
++ printf %02d 9
+ mv patos.flv.008 patos.flv.009
++ expr 9 - 1
+ NUM=8
+ for i in '`seq 1 $NUM`'
++ expr 8 - 1
++ printf %02d 8
+ mv patos.flv.007 patos.flv.008
++ expr 8 - 1
+ NUM=7
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
usuario@usuario-desktop:~/Escritorio/aaa$
Es lógico. Se encuentra con dos archivos que terminan de la misma manera. ¿Cómo se podría hacer para que distinga?
Salud.
Editado -- 05 Sep 2010, 14:15 --Bueno. Al final me han dado una pista que creo que soluciona el tema: se le indica al script que cree un subdirectorio y que vaya moviendo los archivos renumerados a ese subdirectorio, y así no hay conflicto:
Código:
#!/bin/bash
read -p "Introducir nombre base de los archivos: " BASE
# Contar la cantidad de archivos que responden al patrón y enviarla a un archivo de texto
ls $BASE.*|wc -l > numero
mkdir $BASE-renumerados
NUM=`cat numero`
# Comenzar renumerado, de atrás hacia adelante, sumándole uno al nombre, y restándole uno a la variable
for i in `seq 100 $NUM`; do
mv $BASE.*`expr $NUM - 1` $BASE-renumerados/$BASE.`printf "%02d" $NUM` && NUM=`expr $NUM - 1` ; done
for i in `seq 1 $NUM`; do
mv $BASE.0*`expr $NUM - 1` $BASE-renumerados/$BASE.0`printf "%02d" $NUM` && NUM=`expr $NUM - 1` ; done
rm numero
Me parece que el tema queda solucionado. Muchas gracias de nuevo, caballeros, por su inestimable ayuda.
Salud.