Post para programadores ;) Resulta que en una de las listas internas de mi trabajo escribió un compañero diciendo que un cliente ha tenido mala suerte … MUY mala suerte. Su aplicación le ha creado 80000 (ochenta MIL) ficheros con el nombre equivocado.
Resulta que el nombre del fichero debía empezar por:
«00664471_<más_números>»
pero el programa ha nombrado los ficheros empezando por:
» 0066_<más_números>»
Fijaos que el comienzo del nombre de ficheros son 5 espacios en blanco :(
Pues el compi pidió ayuda internamente por si alguien le puede echar una mano con un script para renombrar esos 80000 ficheros …
Como es de esperar en cualquier lista en la que hay más de 1 linuxero … le han llovido infinidad de respuestas: scripts con bash, csh, perl, … Entonces me he preguntado si es que nos aburrimos mucho o es que la flexibilidad que dan los sistemas abiertos dan tanto juego que te encuentras que la única limitación es tu imaginación … o las dos cosas ;) Obviamente, no soy el primero en pensar esto/preguntarme esto ;) Os voy a poner unos cuantos ejemplos de las respuestas que ha recibido el compi:
CSH:
#!/bin/csh -f
foreach f ( \ \ \ \ \ 006* )
foreach? set newname=`echo «$f» | sed ‘s/\ \ \ \ \ 006/00664471/’`
foreach? mv «$f» $newname
foreach? end
¿Alguien usa csh por ahí?
BASH
#!/bin/sh
for file in *.dpx;
do
F1=`echo $file | awk -F»_» ‘{print $1}’`
F2=`echo $file | awk -F»_» ‘{print $2}’`
F3=`echo $file | awk -F»_» ‘{print $3}’`
OLDFILE=»$F1″_»$F2″_»$F3″
NEWFILE=»$F1″»64471″_»$F2″_»$F3″
mv $OLDFILE $NEWFILE
done
Comando «rename«:
rename «00664471_» » 006_» *.dpx
find ./ -type f -name » 006_*.dpx» -print0 | xargs -0 -i rename » 006_» «00664471_» {}
Más BASH:
for F in \ \ \ \ \ 006*.dpx ; do mv «$F» «00664471»; done
Otro BASH:
find . -name ‘*006_005*.dpx’ -print0 | xargs -0 -n 1 rename
The script rename is as simple :
cat <<!! >rename
#!/bin/sh
mv «$1» $1
!!
Como siempre, unas preguntas:
- ¿cómo lo habríais hecho vosotros?
- ¿cuál es la que más os gusta?
- ¿nos aburrimos tanto? ;)
Esto me recuerda, en una lista de Linux (no recuerdo cuál ya que fue hace muuuuuuuchos años) alguien preguntó algo similar y una de las respuestas fue:
gcc