Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

executable file 204 lines (183 sloc) 7.975 kb
#! /bin/bash
#Función que proporciona un mensaje indicando como acceder a la información de ayuda.
help0()
{
echo "Pruebe './fn2u -h' para mas información"
exit 0
}
#Función que proporciona una descripción del script, su forma de uso y algunos ejemplos.
help1()
{
cat <<HELP
fn2u -- Busca dentro de un directorio especifico todos los directorios o archivos que posean dentro de sus nombres caracteres acentuados, espacios o caracteres ñ minusculas y mayusculas.
USO:
fn2u [OPCION] DIRECTORIO ARGUMENTO
OPCION:
-h
Muestra el texto de ayuda y salir
ARGUMENTO:
1
Esta opcion solo indica el nombre de los directorios y archivos encontrados dentro del directorio especificado.
2
Esta opcion renombra todos los directorios y archivos encontrados.
EJEMPLO:
-Buscar y renombrar directorios y archivos dentro del directorio 'mi_directorio' que contengan los caracteres nombrados anteriormente.
fn2u mi_directorio/ 2
-Buscar y nombrar directorios y archivos dentro del directorio 'mi_directorio' que contengan los caracteres nombrados anteriormente.
fn2u mi_directorio/ 1
HELP
exit 0
}
#Función que permite identificar y modificar un determinado directorio
#o archivo si posee alguno de los caracteres nombrados anteriormente.
#Recibe como argumentos:
#1) Archivo o directorio a analizar.
#2) Opción proporcionada por el usuario.
change_name()
{
#Definición de la extensión adicional necesaria para renombrar un directorio o archivo
#con un nombre ya existente.
AD="_"
ADD=1
#Definición de los caracteres que hay que sustituir y sus sustitutos.
old=( "ñ" "Ñ" " " "á" "Á" "é" "É" "í" "Í" "ó" "Ó" "ú" "Ú" )
new=( "n" "N" "_" "a" "A" "e" "E" "i" "I" "o" "O" "u" "U" )
#Bandera que determina si el directorio o archivo posee alguno de los caracteres indicados anteriormente.
flag=0
#Se almacena el path del directorio o archivo analizado en la variable path.
path="$( dirname "$1" )/"
#Se almacena el nombre del directorio o archivo analizado en la variable file.
file=$( basename "$1" )
#Se separá el path y el nombre del directorio o archivo con el fin de no modificar
#algun directorio que sea parte del path proporcionado inicialmente. El objetivo
#es solo moodificar el directorio y sus subdirectorios y archivos.
newfile=$file
#Se comprueba si el directorio o archivo analizado posee alguno de los caracteres
#mencionados anteriormente y se remplazan los caracteres encontrados por sus substitutos.
for i in ${!old[*]} ; do
if [[ "$file" == *${old[i]}* ]] ; then
#Con el comando sed se hace la sustitución de los caracteres respectivos.
newfile=`echo "$newfile" | sed "s/${old[i]}/${new[i]}/g"`
#Se levanta la bandera que indica que el directorio o archivo fue modificado.
flag=1
fi
done
#Si la bandera esta en alto el programa continua, si no el programa se detiene.
[[ $flag == 1 ]] || return 0
#Dependiendo de la opción indicada por el usuario se aplican las siguientes rutinas:
case $2 in
1)
#Si la opción indicada por el usuario es la número 1, se muestra el nombre del directorio
#o archivo que posee alguno de los caracteres indicados anteriormente.
echo "$1" ;;
2)
#Si la opción indicada por el usuario es el numero 2, se renombra el dorectorio o archivo
#que posea alguno de los caracteres indicados anteriormente.
#Si se trata de un archivo se procede de la siguiente manera:
if [ -f "$1" ] ; then
#Si el nombre modificado propuesto no existe se procede a modificarlo directamente.
if [ ! -f "$path$newfile" ] ; then
echo "renombrando $1 como $path$newfile ..."
mv "$1" "$path$newfile"
#Pero si este ya existe se le agrega al final una extensión adicional.
else
#Se separa del nombre del archivo su nombre y extensión propia.
extension=".${newfile##*.}"
newfilename="${newfile%.*}"
#Se busca una extensión apropiada hasta que el nuevo nombre propuesto no exista previamente.
while [ -f "$path$newfilename$AD$ADD$extension" ] ; do
ADD=$(($ADD + 1))
done
echo "renombrando $1 como $path$newfilename$AD$ADD$extension ..."
mv "$1" "$path$newfilename$AD$ADD$extension"
fi
#Si se trataa de un directorio se procede de la siguente manera:
elif [ -d "$1" ] ; then
#Si el nombre modificado propuesto no existe se procede a modificarlo directamente.
if [ ! -d "$path$newfile" ] ; then
echo "renombrando $1 como $path$newfile ..."
mv "$1" "$path$newfile"
#Pero si este ya existe se le agrega al final una extensión adicional.
else
#Se busca una extensión apropiada hasta que el nuevo nombre propuesto no exista previamente.
while [ -d "$path$newfile$AD$ADD" ] ; do
ADD=$(($ADD + 1))
done
echo "renombrando $1 como $path$newfile$AD$ADD ..."
mv "$1" "$path$newfile$AD$ADD"
fi
fi ;;
*)
#Si la opción indicada no es ninguna de las dos anteriores la funció arroja un mensaje de advertencia.
echo "change_name: No se puede actuar usando <<$2>>: La opcion indicada no es valida" ;;
esac
}
#Dependiendo de los argumentos entregados por el usuario al script se aplican las siguientes rutinas:
case $# in
0)
#Si no se entregan argumentos el script listará los directorios o archivos con caracteres
#indicados anteriormente del directorio en el cual se esta ejecutando el bash.
dir=.
n=1 ;;
1)
#Si se proporciona un solo argumento, debe ser un directorio o la opción '-h'.
#Si se tratase de un directorio el script tomará por defecto la opción de listar
#los directorios y archivos dentro del directorio indicado que posean alguno
#de los caracteres indicados anteriormente.
if [ -d "$1" ] ; then
dir=$1
n=1
#Si se tratase de la opción '-h', el script deplegará un mensaje de ayuda y se cerrará.
elif [[ "$1" == "-h" ]] ; then
help1
#Si no fuese ninguno de los dos casos anteriores, el script mostrará una advertencia
#y además recomendará al usuario ejecutar el script con la opción '-h' para recibir ayuda.
else
echo "$0\: no se puede actuar sobre <<$1>>: No existe el directorio"
help0
fi ;;
2)
#Si se proporcionan dos argumentos, el primero debe ser un directorio y el segundo una
#de las opciones indicadas anteriormente en el script y en el texto de ayuda.
#Si el primer argumento efectivamente se tratase de un directorio se ejecuta la siguiente rutina:
if [ -d "$1" ] ; then
dir=$1
#Si el segundo argumento corresponde a una de las opciones indicadas anteriormente en el
#script y en el texto de ayuda, el script prosigue su ejecución.
if [[ $2 == 1 || $2 == 2 ]] ; then
n=$2
#De lo contrario el script mostrará una advertencia y además recomendará
#al usuario ejecutar el script con la opción '-h' para recibir ayuda.
else
echo "$0: No se puede actuar usando <<$2>>: El argumento indicado no es valido"
help0
fi
#Si el primer argumento entregado por el usuario no corresponde a un directorio
#el script mostrará una advertencia y además recomendará al usuario ejecutar
#el script con la opción '-h' para recibir ayuda.
else
echo "$0\: no se puede actuar sobre <<$1>>: No existe el directorio"
help0
fi ;;
*)
#Si la cantidad de argumentos fueran distintos a los indicados anteriormente el
#script mostrará una advertencia y además recomendará al usuario ejecutar el
#script con la opción '-h' para recibir ayuda.
echo "$0: La cantidad de paramentros indicados no es valida"
help0
esac
#Se recorrerá recursivamente el directorio que se desee analizar
for i in $dir/*
do
#Si se encontrará un directorio, se llamará recursivamente al mismo script.
if test -d "$i"
then
#Se llama al mismo script con el directorio encontrado.
$0 "$i" $n
#terminado el script anterior se procederá a actuar con la función change_name
change_name "$i" $n
#De lo contrario se asumirá q se trata de un archivo y se procederá a actuar con la función change_name
else
change_name "$i" $n
fi
done
Jump to Line
Something went wrong with that request. Please try again.