#!/bin/sh # ########################################################################### # # Autor: Miguel Angel Rodríguez (aka timeo) # Email: [EMAIL PROTECTED] || [EMAIL PROTECTED] # # Versión 0.01: 09 de enero de 2004. # Versión 0.02: 29 de abril de 2005. # Última versión: 0.03. 15 de octubre de 2005. # # Descripción: # Script para buscar definiciones de términos # en el diccionario de la R.A.E "on line". # # bRAE.sh busca definiciones de términos en la base de datos de la RAE, # los muestra en pantalla y guarda una copia comprimida en un directorio # creado por el programa para tal efecto. Además posee varias opciones # de búsqueda y "limpieza" de archivos de definiciones. La idea base es # tener un script para consultar en línea el diccionario de la Real # Academia de la Lengua y a la vez ir almacenando el resultado de estas # consultas en nuestro disco duro. # # Dependencias: # Lynx 2.8.X # less # nmap # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. # # # ###########################################################################
# Borramos el fichero de bloqueo al salir. RM=/bin/rm BLOQUEO=${HOME}/.brae.lock test -x $RM || exit 0 trap "$RM -f $BLOQUEO" 1 3 9 15 # Los insoslayables "caminos". PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH # "Localización". # No usamos LANG="C" porque el script es para trabajar # exclusivamente con palabras del idioma castellano. if [[ -z $LANG ]] then LANG="es_ES.ISO-8859-1" export LANG fi # Nos aseguramos de que esté establecido # el entorno para que less pueda abrir # ficheros comprimidos con gzip. LESSFILE=/usr/bin/lessfile test -x $LESSFILE || exit 0 eval "$(lessfile)" ################################################ # # Algunas constantes para hacernos la vida más # cómoda. # ################################################ # Definimos una constante para el nombre del # programa. $0 no nos sirve, pues nos da el # path absoluto. :-( PROGRAMA="bRAE.sh" # Definimos la interfaz de red que nos conecta # a internet. Poner la que corresponda: pppX, # ethX, etc.. DISPOSITIVO="ppp0" # Nombre (URL) del servidor de la RAE. SERVIDOR="buscon.rae.es" # Dirección URL del servidor de la base de datos # de la RAE. URL="http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&LEMA=" # Directorio en donde se guardan las archivos # de términos encontrados y comprimidos. BD=${HOME}/DRAE/ # Fichero que se usa para escribir la lista de # palabras que se desean buscar de una sola vez. FICHEROPALABRAS=${HOME}/palabrasRAE.txt # Fichero usado para guardar temporalmente la # lista de palabras que todavía faltan buscar. FICHEROPALABRASTMP=${HOME}/palabrasRAE-TMP.txt # Ficheros de texto usados para crear un # listado de palabras a partir de un fichero # cualquiera. FICHEROTEMP1=${HOME}/listadoPalabras-TMP1.txt FICHEROTEMP2=${HOME}/listadoPalabras-TMP2.txt # Fichero que contiene el listado completo de # palabras del DRAE que existen en el directorio # del usuario ($HOME/DRAE). # Falta poner el listado oficial (${HOME}/listadoPalabrasDRAE-O.txt). PALABRAS=${HOME}/listadoPalabrasDRAE-U.txt # Cadena de texto que muestra el servidor de la RAE # al pie del artículo. PIEARTICULO="Real Academia Española © Todos los derechos reservados" # Frase para cuando no se halló el artículo en el servidor # de la RAE. NOARTICULO='La palabra consultada no está en el Diccionario.' # Caracteres especiales excluidos. ¿Falta alguno? CARESPECIALES="[]ªº\!\|\"[EMAIL PROTECTED]&\/\(\)\=\?¿\'¡Çç\{\}\*\+\^\_\;\:\.,\<\>\`\\½«»~¬[-]" # Caracteres especiales, letras mayúsculas, letras mayúsculas con # diacríticos y números a borrar de un archivo de texto que se # va a usar como listado de palabras, cuyos significados se # buscarán en el DRAE. CARESPECIALESBORRAR="\\] - ª º ! | \" @ © · # \\$ % & ( ) \= \? ¿ ' ¡ Ç ç { \\} \* + \\\ \\/ _ ; : , \\. < > \` ½ « » ~ ¬ \^ 0 1 2 3 4 5 6 7 8 9 \\[" MAYUSCULASBORRAR="A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z Á É Í Ó Ú Ä Ë Ï Ö Ü" # Array de letras minúsculas para reemplazar a sus correspondientes mayúsculas. MINUSCULAS=(a b c d e f g h i j k l m n ñ o p q r s t u v w x y z á é í ó ú ä ë ï ö ü) # Número máximo de caracteres que puede tener # una palabra let TAMPALABRA=30 # Comandos/programas con sus paths absolutos. CAT=/bin/cat CP=/bin/cp DATE=/bin/date ECHO=/bin/echo GREP=/bin/grep GZIP=/bin/gzip LS=/bin/ls MV=/bin/mv PING=/bin/ping SED=/bin/sed ZGREP=/bin/zgrep IFCONFIG=/sbin/ifconfig CLEAR=/usr/bin/clear CUT=/usr/bin/cut FILE=/usr/bin/file FIND=/usr/bin/find HEAD=/usr/bin/head LESS=/usr/bin/less LYNX=/usr/bin/lynx NMAP=/usr/bin/nmap STAT=/usr/bin/stat TOUCH=/usr/bin/touch WC=/usr/bin/wc # Creamos una función de error para: # 1. Indicar cuál es el programa o comando que no existe; # 2 Indicar que una cadena de entrada es errónea; y # 3. Indicar el fallo en la ejecución de un programa. test -x $ECHO || exit 0 FALLOS=(1 2 3) mensaje_error() { M_CADENA=$1 M_OPCION=$2 if [[ $M_OPCION = ${FALLOS[0]} ]] then $ECHO -e "\nNo existe «$M_CADENA».\n" elif [[ $M_OPCION = ${FALLOS[1]} ]] then $ECHO -e "\nUse parámetro «$M_CADENA».\n" elif [[ $M_OPCION = ${FALLOS[2]} ]] then $ECHO -e "\nFallo en la ejecución de «$M_CADENA».\n" else $ECHO -e "\nError en función «mensaje_error».\n" fi $RM -f $BLOQUEO exit 0 } # Comprobamos que existen todos los comandos/programas # que usaremos en nuestro script. test -x $CAT || mensaje_error "cat-1" "1" test -x $CP || mensaje_error "cp-1" "1" test -x $DATE || mensaje_error "date-1" "1" test -x $GREP || mensaje_error "grep-1" "1" test -x $GZIP || mensaje_error "gzip-1" "1" test -x $LS || mensaje_error "ls-1" "1" test -x $MV || mensaje_error "mv-1" "1" test -x $PING || mensaje_error "ping-1" "1" test -x $SED || mensaje_error "sed-1" "1" test -x $ZGREP || mensaje_error "zgrep-1" "1" test -x $IFCONFIG || mensaje_error "ifconfig-1" "1" test -x $CLEAR || mensaje_error "clear-1" "1" test -x $CUT || mensaje_error "cut-1" "1" test -x $FILE || mensaje_error "file-1" "1" test -x $FIND || mensaje_error "find-1" "1" test -x $HEAD || mensaje_error "head-1" "1" test -x $LESS || mensaje_error "less-1" "1" test -x $LYNX || mensaje_error "lynx-1" "1" test -x $NMAP || mensaje_error "nmap-1" "1" test -x $STAT || mensaje_error "stat-1" "1" test -x $TOUCH || mensaje_error "touch-1" "1" test -x $WC || mensaje_error "wc-1" "1" ################################################ # # Requisitos para correr el programa: # 1. No ejecutarse con permisos de root. # 2. Existir el directorio /home/. # 3. No haber otro proceso bRAE.sh. # ################################################ # Primeramente comprobamos que el programa # no se ejecutará con permisos de superusuario. # Esto no es Windows ;). if [[ `id -u` -lt 1000 ]] then $ECHO -e "\nNo puede tener permisos de superusuario \ para ejecutar este programa.\n" exit 1 fi # Luego comprobamos si existe el directorio $HOME. DIR_HOME="$HOME" if [[ ! -d $DIR_HOME ]] then $ECHO -e "\nNo existe el directorio $DIR_HOME.\n" exit 0 fi # Nos cercioramos de que no se esté ejecutando # un proceso "bRAE.sh". Para ello creamos un # rudimentario fichero de bloqueo # ($HOME/.brae.lock). if [[ -s $BLOQUEO ]] then $ECHO -e "\nTiene otro proceso \"bRAE.sh\" en memoria.\n" exit 1 else $ECHO "1" > $BLOQUEO fi ################################################ # # Funciones para escribir menos y ocupar menos # espacio ;-). # ################################################ buscar_borrar_ficheros() { # Para determinar cuáles ficheros no contienen definiciones # medimos su extensión (100 b), constatamos la existencia # -o no- de dos cadenas de texto especiales y, por último, # comprobamos el tipo de fichero (si es comprimido o no). # Síntesis: comprobamos tamaño (stat), contenido (zgrep) # y formato (file). B_FICHERO=$1 B_OPCION=$2 nom_fichero=`$ECHO $B_FICHERO | $CUT -c 6- | $CUT -f2 -dE | $CUT -c 2- | $CUT -f1 -d.` if [[ `$STAT -c %s $B_FICHERO` -le 100 || -n `$ZGREP 'La palabra '\"$nom_fichero\"' \ no está en el Diccionario.' $B_FICHERO` || -n `$ZGREP 'The requested URL could not be retrieved' $B_FICHERO` \ || -z `$FILE -b $B_FICHERO | $GREP -s 'gzip compressed data'` ]] then case "$B_OPCION" in "0") let numero=numero+1 $ECHO -e "\nBorrando ficheros vacíos... $B_FICHERO [$numero]\n" $RM -f $B_FICHERO || mensaje_error "rm-1" "3" ;; "1") let numero=numero+1 $ECHO -e "\nMostrando ficheros vacíos... $B_FICHERO [$numero]\n" ;; esac fi } crear_listado_palabras() { C_FICHERO=$1 # Comprobamos la entrada para fichero. if [[ ! -f $C_FICHERO ]] then # ¿Existe el fichero? $ECHO -e "\nFichero \"$C_FICHERO\" no existe.\n" $RM -f $BLOQUEO || mensaje_error "rm-2" "3" exit 1 elif [[ ! `$FILE -b $C_FICHERO | $GREP -s 'text'` ]] then # ¿Es un fichero de texto? $ECHO -e "\nNo es un fichero de texto.\n" $RM -f $BLOQUEO exit 1 else # Ok. # Si se trata de un fichero html efectuamos un # volcado de la salida del navegador, para evitar # copiar las etiquetas del lenguaje html para # caracteres especiales (acute, tilde, etc.). if [[ `$FILE -b $C_FICHERO | $GREP -s 'HTML'` || `$FILE -b $C_FICHERO | $GREP -s 'SGML'` ]] then $LYNX -dump -nolist $C_FICHERO > $FICHEROTEMP2 || mensaje_error "lynx-2" "3" # Suprimimos las líneas en blanco. $SED /^$/d $FICHEROTEMP2 > $FICHEROTEMP1 || mensaje_error "sed-2" "3" else $SED /^$/d $C_FICHERO > $FICHEROTEMP1 || mensaje_error "sed-3" "3" fi $ECHO -e "\nCreando listado de palabras a buscar...\n" fi # Reemplazamos caracteres especiales por espacios en blanco. for caracterespecial in $CARESPECIALESBORRAR do $SED s/$caracterespecial/\ /g $FICHEROTEMP1 > $FICHEROTEMP2 || mensaje_error "sed-4" "3" $CP $FICHEROTEMP2 $FICHEROTEMP1 || mensaje_error "cp-2" "3" done # Reemplazamos letras mayúsculas por sus correspondientes minúsculas. let letra=0 for caractermayuscula in $MAYUSCULASBORRAR do $SED s/$caractermayuscula/${MINUSCULAS[letra++]}/g $FICHEROTEMP1 > $FICHEROTEMP2 || mensaje_error "sed-5" "3" $CP $FICHEROTEMP2 $FICHEROTEMP1 || mensaje_error "cp-3" "3" done # Creamos el fichero "palabrasRAE.txt". $CP $FICHEROTEMP1 $FICHEROPALABRAS || mensaje_error "cp-4" "3" # Borramos los ficheros temporales. $RM -f $FICHEROTEMP1 $FICHEROTEMP2 || mensaje_error "rm-3" "3" } # Los nombres de las funciones explican lo que hace # cada una de ellas. ¿O no? comprobar_fichero() { if [[ -s $FICHEROPALABRAS ]] then palabras=`$CAT $FICHEROPALABRAS` else $ECHO -e "\nNo existe fichero de palabras a buscar, o está vacío.\n" $RM -f $BLOQUEO || mensaje_error "rm-4" "3" exit 0 fi } comprobar_fichero_2() { CO_FICHERO=$1 if [[ ! -f $CO_FICHERO ]] then $TOUCH $CO_FICHERO || mensaje_error "touch-2" "3" fi } comprobar_directorio() { if [[ ! -d $BD ]] then mkdir $BD || mensaje_error "mkdir" "3" fi } comprobar_entradas() { # Comprobamos si los caracteres introducidos son # válidos. No aceptamos mayúsculas ni dígitos # ni caracteres especiales. COM_ENTRADA=$1 COM_PATRON=$2 COM_OPCION=$3 case "$COM_OPCION" in "0") comando="$CAT" ;; "1") comando="echo" ;; esac if [[ `$comando $COM_ENTRADA | $GREP [[:upper:]]` \ || `$comando $COM_ENTRADA | $GREP [[:digit:]]` \ || `$comando $COM_ENTRADA | $GREP -e $COM_PATRON` \ || (! -e $COM_ENTRADA && `$comando $COM_ENTRADA | $WC -m` -gt $TAMPALABRA) ]] then $ECHO -e "\nIntroduzca una cadena válida. Debe estar compuesta sólo\n\ de letras minúsculas y tener menos de $TAMPALABRA caracteres.\n" $RM -f $BLOQUEO || mensaje_error "rm-5" "3" exit 0 fi # Comprobamos la longitud de las palabras del fichero, # pues en el anterior if no lo habíamos hecho. if [[ $COM_ENTRADA = $FICHEROPALABRAS ]] then for palabra_fichero in `$comando $COM_ENTRADA` do if [[ `$ECHO $palabra_fichero | $WC -m` -gt $TAMPALABRA ]] then $ECHO -e "\nPalabra demasiado larga.\n" $RM -f $BLOQUEO || mensaje_error "rm-6" "3" exit 1 fi done fi } comprobar_conexion() { # Usamos triple comprobación por si es el caso # de una máquina parte de una LAN con IP MASQUERADE # y con un cortafuegos que filtra el puerto 7. # Es preciso tener nmap instalado :-(. # # 1. ifconfig, # 2. ping, # 3. nmap. COMP_OPCION=$1 if [[ -z `$IFCONFIG $DISPOSITIVO 2> /dev/null | $GREP 'inet addr:' | $CUT -f2 -d: | $CUT -f1 -dP` ]] then if [[ -z `$PING -c 1 $SERVIDOR 2> /dev/null | $GREP 'from' | $CUT -f2 -dm | $CUT -f1 -d:` ]] then if [[ `$NMAP -sP buscon.rae.es 2> /dev/null | $GREP 'Nmap run completed' | $CUT -c 23` == 0 ]] then case "$COMP_OPCION" in "0") # Opción sólo usada con el parámetro "-a". $ECHO -e "\nNo existe conexión a Internet.\n" $RM -f $BLOQUEO || mensaje_error "rm-7" "3" exit 0 ;; "1") conexion=0 ;; esac fi fi fi } buscar_definicion() { # Buscamos la definición del término y el # resultado de la búsqueda lo convertimos # en texto plano y lo guardamos en una # variable. Comprobamos su contenido. Si # es una definición válida lo guardamos # en un fichero comprimido en el directorio # $HOME/DRAE/. B_TERMINO=$1 B_NUMERO=$2 B_OPCION=$3 $ECHO -e "\nBuscando definición de «$B_TERMINO»... $B_NUMERO" def_temp=`$LYNX -dump -nolist ${URL}${B_TERMINO}` || mensaje_error "lynx-3" "3" if [[ -z `$ECHO "$def_temp" | $GREP -Fs "$PIEARTICULO"` ]] then $ECHO -e "\n$NOARTICULO\n" case $B_OPCION in "0") $RM -f $BLOQUEO || mensaje_error "rm-8" "3" exit 0 ;; "1") # !El poder de sed!... y el enorme consumo de ciclos de reloj para # hacer una "virguería" en un ficherito. :-> # Este es un HACK, y de los peores. $SED s/$B_TERMINO//g $FICHEROPALABRAS > $FICHEROPALABRASTMP || mensaje_error "sed-6" "3" $SED '/^$/d' $FICHEROPALABRASTMP > $FICHEROPALABRAS || mensaje_error "sed-7" "3" $RM -f $FICHEROPALABRASTMP || mensaje_error "rm-9" "3" let fallos=fallos+1 return ;; esac fi # Última comprobación: nos cercioramos de que el nombre # del artículo buscado se corresponda con su definición. # A veces (poquísimas), con el parámetro "-a", el servidor # de la RAE devuelve alguna "incoherencia". if [[ -n `$ECHO "$def_temp" | $HEAD -2 | $GREP -s "$B_TERMINO"` ]] then $ECHO "$def_temp" > ${BD}${B_TERMINO} $GZIP -9 -f ${BD}${B_TERMINO} || mensaje_error "gzip-2" "3" else $ECHO -e "\nError en el servidor de la RAE: `$ECHO "$def_temp" \ | $HEAD -2 | $SED /^$/d` != $B_TERMINO.\n" $RM -f $BLOQUEO || mensaje_error "rm-10" "3" exit 1 fi } ################################################ # # Comienza el programa... o las opciones. # ################################################ $CAT << EOF $PROGRAMA EOF if [[ ! $# -ge 1 ]] then $ECHO -e "\nIntroduzca un vocablo. O use el parámetro -m.\n" $RM -f $BLOQUEO || mensaje_error "rm-11" "3" exit 0 ################################################ # # Buscamos la definición de una serie de # palabras que se encuentran en un fichero # ($HOME/palabrasRAE.txt). # Tenemos la opción de ver o no la definición de # cada una de ellas mediante el parámetro [-t]. # ################################################ elif [[ $1 = "-a" ]] then # Averiguamos si estamos conectados a Internet. comprobar_conexion "0" # Comprobamos la existencia del fichero de palabras # y, si existe, pasamos su contenido a la variable # $palabras. comprobar_fichero # Probamos la validez de los caracteres introducidos. comprobar_entradas "$FICHEROPALABRAS" "$CARESPECIALES" "0" # Buscamos las palabras, primero en nuestro disco duro. # Si no se encuentran aquí, buscamos en el servidor de la RAE. let numero=0 for termino in $palabras do if [[ -s ${BD}${termino}.gz ]] then case "$2" in "") $ECHO -e "\nCaché...\n" ;; "-t") $LESS -sSC -~ ${BD}${termino}.gz || mensaje_error "less-2" "3" ;; *) mensaje_error "-t" "2" ;; esac else comprobar_directorio let numero=numero+1 case "$2" in "") buscar_definicion "$termino" "$numero" "1" ;; "-t") buscar_definicion "$termino" "$numero" "1" $LESS -sSC -~ ${BD}${termino}.gz || mensaje_error "less-3" "3" ;; *) mensaje_error "-t" "2" ;; esac fi done let cero=0 resultado=${fallos:=$cero} encontradas=`expr $numero - $resultado` # Variable $fallos viene de función $CLEAR # buscar_definición(). $ECHO -e "\n$numero palabras buscadas en el servidor.\n $encontradas definiciones halladas.\n $resultado no encontradas.\n" # Creamos o actualizamos el listado de palabras # que tenemos en el directorio $HOME/DRAE. cd $BD $LS -1 | $GREP -s '.gz' | $CUT -d '.' -f 1 > $PALABRAS || mensaje_error "ls-2" "3" cd ################################################ # # Buscamos la definición de una palabras que # ya se encuentra en nuestro directorio, y la # sobrescribimos. Sirve para actualizar. # ################################################ elif [[ $1 = "-r" ]] then if [[ -z $2 ]] then $ECHO -e "\nIntroduzca la palabra que desea actualizar.\n" $RM -f $BLOQUEO || mensaje_error "rm-12" "3" exit 0 fi comprobar_entradas "$2" "$CARESPECIALES" "1" # Comprobamos si estamos conectados a Internet. # El resultado lo alojamos en la variable $conexion. comprobar_conexion "1" if [[ -s ${BD}${2}.gz ]] then if [[ $conexion = "0" ]] then $ECHO -e "\nNo existe conexión a Internet.\n" $RM -f $BLOQUEO || mensaje_error "rm-13" "3" exit 0 else comprobar_directorio buscar_definicion "$2" "(actualización)" "0" $LESS -sSC -~ ${BD}${2}.gz || mensaje_error "less-4" "3" $CLEAR fi else $ECHO -e "\nLa palabra que intenta actualizar («$2») no está en su directorio.\n" $RM -f $BLOQUEO || mensaje_error "rm-14" "3" exit 0 fi ################################################ # # Creamos el fichero de palabras a buscar a # partir de cualquier fichero de texto. # ################################################ elif [[ $1 = "-f" ]] then crear_listado_palabras "$2" ################################################ # # Borramos los archivos generados por búsquedas # fallidas. # # - Con el parámetro [-b] sin nada más, buscamos # y borramos todos los ficheros comprimidos # (*.gz). # - Con el parámetro opcional [-t] buscamos # todos los ficheros vacíos, y los borramos. # - Con el parámetro opcional [-h] buscamos y # borramos los ficheros comprimidos de hoy. # - Con el parámetro opcional [-th] borramos # todos los ficheros (comprimidos o no) de hoy. # # Las opciones [-b] y [-b -t] pueden llegar a # ser extremadamente lentas. # ################################################ elif [[ $1 = "-b" ]] then $ECHO -e "\nBuscando ficheros vacíos..." for ficheros in ${BD}* do case "$2" in "") if [[ `$FIND $ficheros -daystart -name '*.gz' -print` ]] then buscar_borrar_ficheros "$ficheros" "0" fi ;; -t) buscar_borrar_ficheros "$ficheros" "0" ;; -h) if [[ `$FIND $ficheros -daystart -name '*.gz' -ctime -1 -print` ]] then buscar_borrar_ficheros "$ficheros" "0" fi ;; -th) if [[ `$FIND $ficheros -daystart -name '*' -ctime -1 -print` ]] then buscar_borrar_ficheros "$ficheros" "0" fi ;; *) mensaje_error "-t, -h, o -th" "2" ;; esac done if [[ $numero -gt 0 ]] then $CLEAR $ECHO -e "\n$numero entradas borradas." $RM -f $BLOQUEO || mensaje_error "rm-15" "3" exit 0 else $ECHO -e "\nNo encontré ficheros para borrar. I'sorry... :-)\n" $RM -f $BLOQUEO || mensaje_error "rm-16" "3" exit 0 fi ################################################ # # Buscamos los archivos generados por búsquedas # fallidas. Igual que con el parámetro [-b] pero # sin borrar nada. # # - Con el parámetro [-v] sin nada más, buscamos # todos los ficheros comprimidos (*.gz). # - Con el parámetro opcional [-t] buscamos la # totalidad de los ficheros vacíos. # - Con el parámetro opcional [-h] buscamos sólo # los ficheros comprimidos (*.gz) de hoy. # - Con el parámetro opcional [-th] buscamos la # totalidad de los ficheros vacíos de hoy. # # Las opciones [-v] y [-v -t] pueden llegar a # ser extremadamente lentas. # # Opción para curiosos 8-). # ################################################ elif [[ $1 = "-v" ]] then $ECHO -e "\nBuscando ficheros vacíos..." for ficheros in ${BD}* do case "$2" in "") if [[ `$FIND $ficheros -daystart -name '*.gz' -print` ]] then buscar_borrar_ficheros "$ficheros" "1" fi ;; -t) buscar_borrar_ficheros "$ficheros" "1" ;; -h) if [[ `$FIND $ficheros -daystart -name '*.gz' -ctime -1 -print` ]] then buscar_borrar_ficheros "$ficheros" "1" fi ;; -th) if [[ `$FIND $ficheros -daystart -name '*' -ctime -1 -print` ]] then buscar_borrar_ficheros "$ficheros" "1" fi ;; *) mensaje_error "-t, -h, o -th" "2" ;; esac done if [[ $numero -gt 0 ]] then $CLEAR $ECHO -e "\nEncontré $numero ficheros vacíos. ¿Muchos?\n" $RM -f $BLOQUEO || mensaje_error "rm-17" "3" exit 0 else $ECHO -e "\nNo encontré ficheros vacíos. I'sorry... :-)\n" $RM -f $BLOQUEO || mensaje_error "rm-18" "3" exit 0 fi ################################################ # # Opción para mostrarnos el número total de # entradas en el directorio del diccionario. # # - Con el parámetro [-n] sin nada más, nos # muestra la totalidad de entradas comprimidas # (*.gz). # - Con el parámetro opcional [-t] nos muestra # el número total de entradas. # - Con el parámetro opcional [-h] nos muestra # el número de ficheros comprimidos de hoy. # - Con el parámetro opcional [-th] nos muestra # el número total de ficheros de hoy. # # Otra opción para curiosos. # ################################################ elif [[ $1 = "-n" ]] then case "$2" in "") cantidad=`$FIND $BD -mindepth 1 -name '*.gz' -print | $WC -l` $ECHO -e "\nHay $cantidad palabras en el diccionario.\n" ;; -t) cantidad_total=`$FIND $BD -mindepth 1 -name '*' -print | $WC -l` $ECHO -e "\nHay $cantidad_total palabras en el diccionario (total).\n" ;; -h) fecha=`$DATE +%d-%m-%y` cantidad_hoy=`$FIND $BD -mindepth 1 -daystart -name '*.gz' -ctime -1 -print | $WC -l` $ECHO -e "\nHay $cantidad_hoy palabras en el diccionario (hoy: $fecha).\n" ;; -th) fecha=`$DATE +%d-%m-%y` cantidad_total_hoy=`$FIND $BD -mindepth 1 -daystart -name '*' -ctime -1 -print | $WC -l` $ECHO -e "\nHay $cantidad_total_hoy palabras en el diccionario (total hoy: $fecha).\n" ;; *) mensaje_error "-t, -h, o -th" "2" ;; esac ################################################ # # Limpiamos el archivo $HOME/palabrasRAE.txt. # Sólo dejamos las palabras cuya definición aún # debemos hallar. # ################################################ elif [[ $1 = "-l" ]] then # Pasamos el contenido del fichero a la # variable $palabras comprobar_fichero comprobar_fichero_2 "$FICHEROPALABRASTMP" let numero=0 for termino in $palabras do if [[ ! -s ${BD}${termino}.gz ]] then $ECHO -e $termino >> $FICHEROPALABRASTMP let numero=numero+1 fi done $MV $FICHEROPALABRASTMP $FICHEROPALABRAS || mensaje_error "mv-2" "3" $ECHO -e "\n$numero palabras guardadas.\n" ################################################ # # Menú para no olvidarnos del uso para el cual # fue hecho este script :-). # ################################################ elif [[ $1 = "-m" ]] then espacio=`$ECHO -e "\t\t"` declare -a MENU MENU=( "Busca definiciones en el DRAE \"on line\"." "Versión: 0.03" "Autor: Miguel Angel Rodríguez" "" "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" "Licencia: Este programa es software libre. Vea el código fuente" "para las condiciones de copia. No hay NINGUNA GARANTÍA;" "ni siquiera la que implique garantía de COMERCIABILIDAD" "o IDONEIDAD PARA UN FIN DETERMINADO." "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" "" "Modo de uso:" "----------- bRAE.sh [PALABRA] busca definición de [PALABRA]." "" "[-r] [palabra] -> busca definiciones ya encontradas y las sobrescribe." "[-a] -----------> busca definiciones de palabras desde un fichero especial." "[-a] [-t] ------> ídem anterior pero mostrando cada una de las definiciones." "[-f] [FICHERO] -> crea fichero especial a partir de un fichero cualquiera." "" "[-b] -----------> busca y borra las entradas vacías con extensión <*.gz>." "[-b] [-t] ------> busca y borra todas las entradas vacías." "[-b] [-h] ------> busca y borra las entradas vacías con extensión <*.gz> de hoy." "[-b] [-th] -----> busca y borra todas las entradas vacías de hoy." "" "[-v] -----------> busca los ficheros vacíos con extensión <*.gz>." "[-v] [-t] ------> busca todos los ficheros vacíos." "[-v] [-h] ------> busca los ficheros vacíos con extensión <*.gz> de hoy." "[-v] [-th] -----> busca todos los ficheros vacíos de hoy." "" "[-n] -----------> muestra cantidad de ficheros con extensión <*.gz>." "[-n] [-t] ------> muestra total de ficheros." "[-n] [-h] ------> muestra la cantidad de ficheros con extensión <*.gz> de hoy." "[-n] [-th] -----> muestra el total de ficheros de hoy." "" "[-l] -----------> limpia el fichero de palabras encontradas." "" "[-m] -----------> este menú." "" "Comunicar bugs y modificaciones a <[EMAIL PROTECTED]>." "" ) let numero=0 while [ $numero -lt 40 ] do $ECHO ${MENU[numero++]} done ################################################ # # Buscamos la definición de una palabra mediante # una consulta al servidor de la RAE. # ################################################ else comprobar_entradas "$1" "$CARESPECIALES" "1" # Comprobamos si estamos conectados a Internet. # El resultado lo alojamos en la variable $conexion. comprobar_conexion "1" if [[ -s ${BD}${1}.gz ]] then $ECHO -e "\nCaché...\n" $LESS -sSC -~ ${BD}${1}.gz || mensaje_error "less-5" "3" elif [[ $conexion = "0" ]] then $ECHO -e "\nNo existe conexión a Internet.\n" comprobar_fichero_2 "$FICHEROPALABRAS" if [[ ! `$GREP -w $1 $FICHEROPALABRAS` ]] then $ECHO -e "Palabra guardada para su posterior búsqueda.\n" $ECHO "$1" >> $FICHEROPALABRAS else $ECHO -e "Esta palabra ya fue guardada para su posterior búsqueda.\n" fi $RM -f $BLOQUEO || mensaje_error "rm-19" "3" exit 0 else comprobar_directorio buscar_definicion "$1" "" "0" $LESS -sSC -~ ${BD}${1}.gz || mensaje_error "less-6" "3" $CLEAR fi fi # Salida del programa. if [[ $? = 0 ]] then $ECHO "." $RM -f $BLOQUEO || mensaje_error "rm-20" "3" exit 0 else $ECHO -e "\n ${PROGRAMA}: El programa terminó con error.\n" $RM -f $BLOQUEO || mensaje_error "rm-21" "3" exit 1 fi # -=-= fin de bRAE.sh =-=- # Para escribir este shellscript se usó # VIM - Vi IMproved 6.3 (2004 June 7, compiled Sep 1 2005 16:49:45) -- Miguel Ángel Rodríguez mailto:[EMAIL PROTECTED] http://www.cefeidas.homelinux.org Linux User Registered #65964 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Para obtener mi clave pública escríbeme un email con el Subject: enviar clave publica %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The effort to understand the universe is one of the very few things that lifts human life a little above the level of farce, and gives it some of the grace of tragedy. (Steven Weinberg, The First Three Minutes) -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]