
Cannot retrieve contributors at this time
| #! /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 |