domingo, 28 de abril de 2013

Shell enlaces simbolicos y duros


Hacer un shell script que va a tener un parametro (path absoluto)

ejemplo : /home/pepito
Obteng 2 archivos

  • el primero va a encontrar todos los enlaces duros con la siguiente información:

              1)cantidad=x
              2) nombres

  • el segundo archivo va encontrar los enlaces sismbolicos con la siguiente información:

             1)cantidad=y
             2) nombre_fuente nombre_enlace (el nombre fuente se refiere al nombre original del enlace)

Nota: Trabaja con i-nodo


Respuesta:


#!/bin/bash


infoDuros="fuertes.txt";

infoSimbolicos="simbolicos.txt";

#verifica que los archivos fuertes.txt y simbolicos.txt  existan
crearArchivos(){
  if  [ ! -f $infoDuros ];
      then
echo "Creando archivo $infoDuros de configuracion";
         echo "" > $infoDuros;
      fi

  if  [ ! -f $infoSimbolicos ] ;
      then
   echo "Creando archivo $infoSimbolicos de configuracion";
          echo "" > $infoSimbolicos; 
      fi



found=""; 


buscarFuertes(){   
cod=$1;
cont=0;  
  for index in `find $ruta -inum $cod`  
    do     
        cont=`expr $cont + 1`;
   done    
   if [ $cont -lt  2 ];
      then
          datos="";
      fi
return $cont;
}  

enlacesFuertes(){
 echo "">$infoDuros;
 echo "Inodo y ruta de enlace Fuerte:">>$infoDuros;
 echo "">>$infoDuros;
 ruta=$1;
 numFuertes=0; 
 printf "Procesando enlaces duros: ";
oldIFS=$IFS     # conserva el separador de campo
 IFS=$'\n' 
          for k in `ls $ruta` 
            do
        rutaArchivo="$ruta/$k"; 
      if [ -f "$rutaArchivo" ];
 then    
      inodo=`ls -il $rutaArchivo|cut -f 1 -d ' '`; 
                       buscarFuertes $inodo;
      tam=$?;
if [ $tam -gt  1 ]; then
           echo $inodo" "$rutaArchivo >>$infoDuros ; 
 numFuertes=`expr $numFuertes + 1`;
 printf ">";
fi

 fi
         done  

IFS=$old_IFS     # restablece el separador de campo predeterminado
printf " $numFuertes";
  echo "">>$infoDuros;
  echo "Numero de enlaces duros: $numFuertes">>$infoDuros;
echo;
}


enlacesSimbolicos(){
 echo "">$infoSimbolicos;
 echo "Fuente - Enlace Simbolico:">>$infoSimbolicos;
 echo "">>$infoSimbolicos;
 printf "Procesando enlaces simbolicos: "; 
 pathAbs=$1;  
 numSimbolicos=0;
 oldIFS=$IFS     # conserva el separador de campo
 IFS=$'\n' 
          for arc in `ls $pathAbs`
            do  
       if [ -h "$pathAbs/$arc" ];
  then 
    
         padre=`ls -l "$pathAbs/$arc"| awk 'BEGIN {FS="-> "}; {print $2}'`; 
echo "$padre - $arc">>$infoSimbolicos;  
                 numSimbolicos=`expr $numSimbolicos + 1`;
                        printf ">";
            fi 

           done
  printf " $numSimbolicos";
  echo "">>$infoSimbolicos;
  echo "Numero de enlaces simbolicos: $numSimbolicos">>$infoSimbolicos;
echo;
IFS=$old_IFS     # restablece el separador de campo predeterminado

}  


InitEnlaces(){
#muestra el dialogo de seleccion de directorio a procesar

ruta=`zenity --file-selection --directory --filename="$HOME/Escritorio" --title="Seleccione el direcotorio para buscar los enlaces"`

if [ -n "$ruta" ];
then
     if [ -d "$ruta" ];
then
enlacesFuertes $ruta
         enlacesSimbolicos $ruta
 zenity --question \
--text="La busqueda de enlaces terminada, Desea ver los resultados en los archivos $infoSimbolicos y $infoDuros.?";
  if [ $? -eq 0 ];then
  gedit $infoSimbolicos $infoDuros
fi

     else
          zenity --warning \
 --text="El path debe ser un directorio no un archivo.";

     fi

else   
       zenity --warning \
--text="No digito un path valido por favor intentelo nuevamente.";
fi
 } 


crearArchivos
InitEnlaces
  
exit 0;