practica con scripts unix no funciona

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: maiku, akodo

Responder
borja_usuario
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Mar Dic 10, 2013 8:53 pm

practica con scripts unix no funciona

Mensaje por borja_usuario »

Hola, les agradeceria que me ayudasen con un par de scripts. Veran me mandaron hacer tres scripts de unix para clase. El primero me salio sin problemas, pero los otros dos no hay manera
El primero:
Recibe un número entero como parámetro que representa una cantidad en bytes, e imprime por la salida estándar el tamaño en bytes o en múltiplos (Kilobytes, Megabytes, Gigabytes o Terabytes), según sea la cantidad. Por ejemplo, si la cantidad no llega a 1 KB (Kilobyte), entonces se mostrará en bytes, si es igual o mayor de 1 KB (pero no llega a un múltiplo superior), se mostrará en Kilobytes, etc.
en el último caso, en que no se proporciona ningún valor pero no da error y simplemente termina sin mostrar nada.
Este lo tengo hecho y me da bien

El segundo

countFrom.sh.Recibe como parámetro un nombre de fichero. El contenido de este fichero se corresponde con la salida por pantalla de la orden
ls -l. Por ejemplo, si introducimos esta orden
$ ls -l /sbin > aaa
las primeras líneas del fichero aaa
podrían tener este aspecto
total 9460
-rwxr-xr-x 1 root root 6272 2009-12-25 09:26 acpi_available
-rwxr-xr-x 1 root root 19512 2011-08-09 18:16 agetty
-rwxr-xr-x 1 root root 5560 2011-05-05 07:26 alsa
-rwxr-xr-x 1 root root 89792 2011-10-11 09:28 alsactl
-rwxr-xr-x 1 root root 6296 2009-12-25 09:26 apm_available
-rwxr-xr-x 1 root root 761360 2011-10-04 21:41 apparmor_parser
Disponiendo de un fichero como este, ya podemos ver cómo se espera que funcione countFrom.sh:
$ ./countFrom.sh

Como ves, si no se indica nada, tampoco da error; simplemente no muestra nada. Si se le pasa un fichero, en cambio:
$ ./countFrom.sh aaa
9425915

el script suma el tamaño en bytes de todos los ficheros que aparecen en el listado que contiene el fichero aaa, y muestra por pantalla esta cantidad, también en bytes. Observa que el tamaño de cada fichero aparece en la quinta columna de dicho listado.
Como puedes comprobar, countFrom.sh no debe encargarse de mostrar el tamaño en múltiplos de bytes, y tam- poco se indica que son bytes; simplemente muestra un número. De combinar estos dos scripts se encargará nuestro tercer y último script, niceSum.sh . Pero antes de ello, podemos ver cómo podemos utilizar countFrom.sh y niceSize.sh conjuntamente:
$ ./niceSize.sh $(./countFrom.sh aaa)
9.42 Megabytes
Algo así es lo que necesitarás hacer en niceSum.sh
Este script no me sale y no encuentro la manera de hacerlo, agradezco la ayuda

El tercero
niceSum.sh
.
Este script puede invocarse de tres formas distintas:

a) Si no recibe ningún parámetro, asume que se quiere contar el tamaño total de los ficheros del directorio actual:
$ ./niceSum.sh
11.59 Kilobytes

b) Si se le pasa el nombre de un fichero, se asume que es un fichero como el que veíamos antes, aaa, es decir que contiene la salida de una orden ls -l ejecutada en algún punto del sistema de ficheros.
$ ./niceSum.sh aaa
9.42 Megabytes

c) Y si se le pasa el nombre de un directorio, se asume que se desea contar lo que ocupan los ficheros de dicho directorio. Veamos algunos ejemplos:
$ ./niceSum.sh .
11.59 Kilobytes

Lógicamente, este resultado es idéntico a no pasarle ningún parámetro (como en el ejemplo del apartado 3a)
$ ./niceSum.sh ..
8.55 Kilobytes
$ ./niceSum.sh /sbin/
9.42 Megabytes

Fíjate en que lo que obtenemos en el último ejemplo coincide con ./niceSum.sh aaa puesto que el fichero aaa contiene, precisamente, el listado de ficheros del directorio /sbin.
Por último, si el argumento que recibe este script no se corresponde con un nombre de directorio o de fichero válidos, debe mostrar un mensaje por la salida estándar (la pantalla). Así:

$ ./niceSum.sh /sbin/meInventoUnNombre
No existe "/sbin/meInventoUnNombre" como fichero o directorio
Se puede comprobar si existe un fichero, opcionalmente con su ruta absoluta o relativa, mediante la siguiente sentencia condicional:

if [ -f /home/jack/scripts/p9.sh ]; then
echo "Existe"
else
echo "No existe"
fi
Para comprobar si existe el directorio, se usa -d en lugar de -f
Este otro tampoco me sale

Les agradezco mucho la ayuda
Última edición por mcun el Mar Dic 10, 2013 9:31 pm, editado 1 vez en total.
Razón: Titulo editado por contener dichos como "Ayuda" por favor revisa el reglamento

Avatar de Usuario
mcun
Administrador
Administrador
Mensajes: 3888
Registrado: Lun Abr 19, 2010 12:30 am
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)
Contactar:

Re: practica con scripts unix no funciona

Mensaje por mcun »

por favor postea los códigos que tengas hechos así podemos ver que esta mal

PD: usa las etiquetas code para postear el código
Los programadores de verdad no documentan. La documentación es para los idiotas que no pueden leer un volcado de memoria.

Trusted Network and Developer | Lee el Reglamento !! |WIKI-EL | Twitter @mr_mcun
Debian + TTY | ArchLinux + awesome | openSUSE + Gnome-Shell | Linux User #508809

borja_usuario
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Mar Dic 10, 2013 8:53 pm

Re: practica con scripts unix no funciona

Mensaje por borja_usuario »

Del ejercicio uno, que si que me sale, tengo lo siguiente:

Código: Seleccionar todo

#! /bin/bash

K=1000
let M=$K*$K
let G=$K*$M
let T=$K*$G

if [ "$#" = "0" ]; then
	echo ""
elif [ $1 -lt $K ]; then
	echo "$1 bytes"
elif [ $1 -lt $M ]; then
	division=$(echo "scale=2; $1/$K" | bc -l)
	echo " $division kilobytes"
elif [ $1 -lt $G ]; then
	division=$(echo "scale=2; $1/$M" | bc -l)
	echo " $division megabytes"
elif [ $1 -lt $T ]; then
	division=$(echo "scale=2; $1/$G" | bc -l)
	echo " $division gigabytes"
else
	division=$(echo "scale=2; $1/$T" | bc -l)
	echo " $division terabytes"
fi
Del dos tengo poca cosa, pero no se me ocurre que hacer:

Código: Seleccionar todo

#!/bin/bash
SUMA=0
for ELEMENTOS in `ls -l | grep ^- | sed "s:^\([^ ]*[ ]*\)\{4\}\([0-9]*\).*$:\2:g"`; do
SUMA=$[$SUMA+$ELEMENTOS]
done
echo  "la suma total es: $SUMA"
Y del tercero necesito el dos, pero no se me ocurre como lo podria hacer.

Avatar de Usuario
mcun
Administrador
Administrador
Mensajes: 3888
Registrado: Lun Abr 19, 2010 12:30 am
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)
Contactar:

Re: practica con scripts unix no funciona

Mensaje por mcun »

A mi me sale esto con el segundo code que posteastes pero no entiendo que quieres lograr ..

Código: Seleccionar todo

mcun@RUN ~ $ sh eje.sh 
la suma total es: $[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[$[0+745]+93600659]+37325]+66909]+20331]+4178]
+393758060]+2044661760]+1138686]+147538+44]+74491876]+295222289]+876]+0]+168]+0]+168]+2693]+338]+258747982]+270401230]+3757]
+545]+1241335]+254]+25088]+16842]+2076]+0]+2959]+7024]+226]+17017728]+303]+246]+511]+511]+726]+73728]+876]+941731840]
Los programadores de verdad no documentan. La documentación es para los idiotas que no pueden leer un volcado de memoria.

Trusted Network and Developer | Lee el Reglamento !! |WIKI-EL | Twitter @mr_mcun
Debian + TTY | ArchLinux + awesome | openSUSE + Gnome-Shell | Linux User #508809

borja_usuario
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Mar Dic 10, 2013 8:53 pm

Re: practica con scripts unix no funciona

Mensaje por borja_usuario »

el proposito del script es sumar todos los bytes de los archivos de un ficherro. gracias por tu ayuda

Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: practica con scripts unix no funciona

Mensaje por hipersayan_x »

borja_usuario escribió:el proposito del script es sumar todos los bytes de los archivos de un ficherro. gracias por tu ayuda
Leé el tamaño de los archivos con awk '{print $5}', y finalmente suma los resultados con let suma+=tamano_archivo.
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net

borja_usuario
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Mar Dic 10, 2013 8:53 pm

Re: practica con scripts unix no funciona

Mensaje por borja_usuario »

gracias hipersayan_x por la ayuda pero no lo consigo hacer, la verdad es que hemos dado unix solo en dos dias y estoy un poco perdido, esto es lo que he sabido hacer, pero me da error:

Código: Seleccionar todo

#!/bin/bash
suma=0; 
if [ "$#" = "0" ]; then
	echo ""
elif [for elementos in `ls -l|awk '{print $5}'`];do
      let suma+=$elementos
echo  "la suma total es: $suma"
fi 
	done
el if lo uso, porque en caso de que no se le pase ningun fichero no debe dar error pero tampoco ninguna suma

Editado -- Mié Dic 11, 2013 7:22 pm --

He hecho este otro archivo, y si que me da una suma

Código: Seleccionar todo

#!/bin/bash
suma=0;
for file in $(ls -l);
 do if [[ -f $file ]];
 then suma=$(( $suma+$(du -b $file | awk '{print $1}') ));
 fi; 
done; 
echo $suma
El unico problema es como le puedo pasar un archivo para que sume los bytes del fichero

Avatar de Usuario
t4rr1t0
Ganador CSEL 2011
Ganador CSEL 2011
Mensajes: 357
Registrado: Dom Dic 12, 2010 6:07 pm
Contactar:

Re: practica con scripts unix no funciona

Mensaje por t4rr1t0 »

Si al final ibas a usar du, entonces puedes hacer que el te de el total, no veo la necesidad de un script para eso

Código: Seleccionar todo

du -c *.png |cut -f1|tail -n1
(en este ejemplo obtengo el total de todos los archivos con extensión png, solo para fines de ejemplo)

Pero si tiene que por fuerza ser un script, entonces puedes hacer algo como esto:

Código: Seleccionar todo

#!/bin/bash
du -c $@ |cut -f1|tail -n1
Ya que metiste a du en el juego, ya no tiene sentido la suma y la vuelta por ls.

borja_usuario
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Mar Dic 10, 2013 8:53 pm

Re: practica con scripts unix no funciona

Mensaje por borja_usuario »

gracias t4rr1t0 pero no me da bien la suma de los bytes, me da 476 y en realidad tengo 426205.
lo he intentado hacer como lo he hecho porque debo hacer que si no se introduce ningun fichero no de ningun numero, pero que tampoco de error, y si se introduce algun fichero que haga la suma de los bytes

Avatar de Usuario
t4rr1t0
Ganador CSEL 2011
Ganador CSEL 2011
Mensajes: 357
Registrado: Dom Dic 12, 2010 6:07 pm
Contactar:

Re: practica con scripts unix no funciona

Mensaje por t4rr1t0 »

du -c DA la suma, solo agrega -b para que la salida sea en bytes. ¿Estas leyendo la información de los comandos que estas usando?

Quedaria asi:

Código: Seleccionar todo

#!/bin/bash
du -bc $@ |cut -f1|tail -n1
lo grabas como, que se yo, script.sh y le pasas los archivos como lista.

Código: Seleccionar todo

sh script.sh archivo1 archivo2 ...
o como expresión regular

Código: Seleccionar todo

sh script.sh *.txt

Para que no te de erroe cuando no hay archivos le agregas un if para que confirme si hay argumentos.

hth

borja_usuario
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Mar Dic 10, 2013 8:53 pm

Re: practica con scripts unix no funciona

Mensaje por borja_usuario »

he conseguido hacerlo de otra forma con los comandos que nos explicaron en clase, el problema es que al poner el if me da error, y nose porque.
Este es el script sin el if, que me da bien:

Código: Seleccionar todo

#! /bin/bash
suma=0
for arch in $1
do
if [ ! -d $arch ]
then
  tamano=`du -bc $arch | cut -f1|tail -n1`
  let suma=$suma+$tamano
fi
done
echo $suma
Este es el script con el if añadido, nose porque me da error, si me lo podeis decir

Código: Seleccionar todo

#! /bin/bash
suma=0
if [ "$#" = "0" ]; then
	echo ""
else
	for arch in $1
	do
	if [ ! -d $arch ]
	then
	  tamano=`du -bc $arch | cut -f1|tail -n1`
	  let suma=$suma+$tamano
	fi
	done
	echo $suma
Muchas gracias, de verdad, me estais ayudando mucho

Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: practica con scripts unix no funciona

Mensaje por hipersayan_x »

borja_usuario escribió:gracias hipersayan_x por la ayuda pero no lo consigo hacer, la verdad es que hemos dado unix solo en dos dias y estoy un poco perdido, esto es lo que he sabido hacer, pero me da error:

Código: Seleccionar todo

#!/bin/bash
suma=0; 
if [ "$#" = "0" ]; then
	echo ""
elif [for elementos in `ls -l|awk '{print $5}'`];do
      let suma+=$elementos
echo  "la suma total es: $suma"
fi 
	done
Dentro del let las variables van sin el signo $, y está mal el orden de fi y done, así debería funcionar:

Código: Seleccionar todo

#!/bin/bash
suma=0; 
if [ "$#" = "0" ]; then
	echo ""
elif [for elementos in `ls -l|awk '{print $5}'`];do
        let suma+=elementos
    done

    echo  "la suma total es: $suma"
fi 
Última edición por hipersayan_x el Mié Dic 11, 2013 9:26 pm, editado 1 vez en total.
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net

Avatar de Usuario
t4rr1t0
Ganador CSEL 2011
Ganador CSEL 2011
Mensajes: 357
Registrado: Dom Dic 12, 2010 6:07 pm
Contactar:

Re: practica con scripts unix no funciona

Mensaje por t4rr1t0 »

Si tienes que si o si trabajar con un archivo con generado con la salida de ls -l, entonces prueba quedaria mejor asi:

Código: Seleccionar todo

#!/bin/bash
argumentos=${#@}
if [ $argumentos -gt 0  ]; then
archivo=$1
for tamano in $(cat $archivo|awk '{print $5}')
do let suma+=$tamano
done
echo $suma
fi
fijate la comparación en el IF, es una comparación numerica, por lo que debes usar el operador acorde.

Este script recibe un archivo que contenga la salida de un ls -l.

hth

borja_usuario
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Mar Dic 10, 2013 8:53 pm

Re: practica con scripts unix no funciona

Mensaje por borja_usuario »

cierto hipersayan_x, gracias, en el examen me pueden salir caros fallos como esos.
Muchas gracias t4rr1t0 es justo eso lo que necesitaba, me has salvado. Ahora me queda hacer el tercero, os voy contando a ver que tal.
Muchas gracias por la ayuda

Editado -- Mié Dic 11, 2013 10:05 pm --

El siguiente script lo que debe hacer es:
1) Si no recibe ningún parámetro, asume que se quiere contar el tamaño total de los ficheros del directorio actual
2) Si se le pasa el nombre de un fichero, se asume que es un fichero como el que veíamos antes,aaa, es decir que contiene la salida de una orden ls -l ejecutada en algún punto del sistema de ficheros.
3) Y si se le pasa el nombre de un directorio, se asume que se desea contar lo que ocupan los ficheros de dicho directorio. Veamos algunos ejemplos:
Mi idea principal era algo asi:

Código: Seleccionar todo

#! /bin/bash
argumentos=${#@}
if [ $argumentos -gt 0  ]; then
du -bc $argumentos |cut -f1|tail -n1
elif [ $argumentos
fi
el problema es que me da error
y que ahi me he quedado atascado, y nose como distinguir de cuando me da un fichero a cuando me da un directorio

Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: practica con scripts unix no funciona

Mensaje por hipersayan_x »

Con esto tienes la mitad del ejercicio resuelto:

http://stackoverflow.com/questions/4665 ... ry-in-bash

Luego tienes que adaptar el script para que lea el resultado del ls desde una variable, lo que contenga esa variable dependerá de la entrada (según el enlace de arriba).
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net

Responder
  • Temas similares
    Respuestas
    Vistas
    Último mensaje