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;

lunes, 20 de agosto de 2012

Mostrar todos los usuarios que su identificador

Este shell fue donado por:  M.Sc. (c). Lic. Luis Carlos Vargas Cogollo


Con una secuencia de Comandos Encadenados  por Pipes, mostrar todos los usuarios que su identificador (UID) sea superior a 10 e inferior a 1024. 

   solucion

Este problema lo resolvemos a trave de  Comandos Encadenado
s

cat /etc/passwd | sort | awk -F':' '$3 > 10 && $3 < 1024 {printf "Login: " $1 " - " "UId: " $3 "\n"}'

domingo, 19 de agosto de 2012

Mayor de 3 numeros shell script (Modo eficiente)


Se debe ejecutar con el comando bash no con sh.

#!/bin/bash

echo "Digite numero 1"
read a

echo "Digite numero 2"
read b

echo "Digite numero 3"
read c

numeros=( $a $b $c )
mayor=${numeros[0]}
for i in ${numeros[*]};
do
if [ $mayor -lt $i ];
   then
   mayor=$i
   fi
done

zenity --info --text "El mayor es $mayor"

 

exit 0

Generar piramide con shell script

Se debe ejecutar con el comando bash no con sh.


#!/bin/bash
echo "digite tamaño de la piramide (solo digitos)!"
num=`zenity --entry --text "Digite tamaño del triangulo (Solo digitos)" --title "Triangulo"`
b=$num

for ((i=1;i<=num;i++,b--))
    do

    for ((j=1; j<=b;j++))
        do
        cadena="$cadena  "
        done
 
for ((k=1; k<=i;k++))
        do
        cadena="$cadena  "
        cadena="$cadena$i"
        done
    cadena="$cadena\n"

    done
echo $cadena

zenity --info --text "$cadena"
exit 0

-----------------------------------------------------------------------------------------------
Salida del shell con tamaño 6

Mayor y menor de 3 numeros shell script


#!/bin/bash

echo "numero a"
read n1
echo "numero b"
read n2
echo "numero c"
read n3

#-----------------mayor-----------------------

if [ $n1 -gt $n2 ] && [ $n1 -gt $n3 ];
  then
   zenity --info --text " el mayor es: $n1"
  fi

if [ $n2 -gt $n1 ] && [ $n2 -gt $n3 ];
  then
   zenity --info --text " el mayor es: $n2"
  fi

if [ $n3 -gt $n1 ] && [ $n3 -gt $n2 ];
  then
   zenity --info --text " el mayor es: $n3"
  fi

#-----------------menor-----------------------

if [ $n1 -lt $n2 ] && [ $n1 -lt $n3 ];
  then
   zenity --info --text " el menor es: $n1"
  fi

if [ $n2 -lt $n1 ] && [ $n2 -lt $n3 ];
  then
   zenity --info --text " el menor es: $n2"
  fi

if [ $n3 -lt $n1 ] && [ $n3 -lt $n2 ];
  then
   zenity --info --text " el menor es: $n3"
  fi


exit 0

Comparacion de 2 cadenas en shell script


#!/bin/bash

echo "Digite la primera cadena"
read cad_a

echo "Digite la segunda cadena"
read cad_b

if [ "$cad_a" = "$cad_b" ];
   then
   zenity --info --text "Las cadenas ($cad_a) y ($cad_b) son iguales"
   else
   zenity --info --text "Las cadenas ($cad_a) y ($cad_b)  son distintas"
   fi
exit 0

Saber si una palabra es palindrome en shell script

Para ejecutar este codigo lo hacen con el comando bash no lo ejecuten con sh.

#!/bin/bash

palabra=`zenity --entry --text="Digite palabra a verificar!" --title="palindrome"`
b=${#palabra}
echo $b
for ((i=1; i<=`expr ${#palabra} / 2`;i++,b--))
do

if [ "`expr substr "$palabra" $i 1`" == "`expr substr "$palabra" $b 1`"  ];
   then

   if [ $i -eq `expr ${#palabra} / 2` ];
     then
     zenity --info --text="El parametro $palabra\n es palindrome"
   
     fi

   else
   zenity --info --text="El parametro $palabra\n no es palindrome"
   break
   fi

done

exit 0