Foros del Web » Administración de Sistemas » Unix / Linux »

Una mano para un Script de Linux

Estas en el tema de Una mano para un Script de Linux en el foro de Unix / Linux en Foros del Web. Hola a todos, soy nuevo en el foro y estoy aquí en busca de ayuda. Llevo unos días intentado meter mano al script que dejo ...
  #1 (permalink)  
Antiguo 04/11/2015, 03:56
 
Fecha de Ingreso: noviembre-2015
Mensajes: 2
Antigüedad: 9 años, 1 mes
Puntos: 0
Una mano para un Script de Linux

Hola a todos, soy nuevo en el foro y estoy aquí en busca de ayuda. Llevo unos días intentado meter mano al script que dejo a continuación. He visto algo de script en bash, lo básico, pero no se por donde empezar. Toda ayuda es bienvenida y agradecida.

Código BASH:
Ver original
  1. #! /bin/bash
  2. # Definir vector con las extensiones que van a ser buscadas
  3. # Definir vector para almacenar los resultados
  4.  
  5. # Definir la funcion buscarficheros (parametro directorio, vectorresultadoscarpeta)
  6.     # Para cada subcarpeta en directorio
  7.         # buscarficheros (subcarpeta, vectorresultadoscarpeta)
  8.     # Fin para
  9.     # Para cada fichero en directorio
  10.         # Si la extension del fichero esta en el vector de extensiones
  11.             # vectorresultadoscarpeta(extension).Cuantos=vectorresultadoscarpeta(extension).Cuantos+1
  12. #vectorresultadoscarpeta(extension).NuevoElemento(fichero.tamaño,fichero.fecha_modificacion)
  13.         # Fin si
  14.     # Fin para
  15. # Fin de la funcion
  16.  
  17. # Para cada subdirectorio en ParametrosdirectorioInicial
  18.     # vectorresultados.AñadirElemento(subdirectorio)
  19.     # buscarficheros(subdirectorio,vectorresultados(subdirectorio))
  20. # Fin para
  21.  
  22. # Para cada elemento en vectorresultados
  23.     # Escribir vectorresultados(elemento)//Nombre del directorio
  24.     # espaciototal=0
  25.     # Para cada extension en vectorresultados(elemento)
  26.         # Escribir extension
  27.         # Escribir vectorresultados(elemento)(extension).cuantos()
  28.         # Comentario: Calcula el tamaño total para esta extension
  29.         # Espacioextension=0
  30.         # Tiempo=0
  31.         # Para cada fichero en vectorresultados(elemento)(extension)
  32.             # espacioextension=espacioextension+fichero.espacio
  33.             # tiempo=diasentre(hoy,fichero.fechamodificacion)
  34.         # Fin para
  35.         # Escribe "Edad media de los ficheros: " tiempo/vectorresultados(elemento)(extension).cuantos()
  36.         # Escribe "La extension " extension "ocupa " espacioextension
  37.         # espaciototal=espaciototal+espacioextension
  38.     # Fin para
  39.     # Escribe "Espacio total de la carpeta: " espaciototal
  40. # Fin para


Un saludo a todos y muchísimas gracias.

Última edición por AlvaroG; 04/11/2015 a las 07:48 Razón: coloreado de código
  #2 (permalink)  
Antiguo 04/11/2015, 07:55
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Una mano para un Script de Linux

Hola, bienvenido a FdW.

Un script de shell que haga un uso tan extensivo de vectores realmente no es buena idea. El soporte para arrays en bash o ksh es muy limitado.

Además, ¿qué tanto de lo que se te pide es sintaxis, y qué tanto utilizar programas existentes en cualquier sistema Unix? por ejemplo, calcular el espacio total utilizado por un directorio es tan simple como
Código BASH:
Ver original
  1. du -csh directorio
Y encontrar archivos cuyo nombre tenga una extensión particular (o una lista de extensiones):
Código BASH:
Ver original
  1. find directorio \( -name "*.ext1" -o -name "*.ext2" ... \)


Vas a tener que admitir que esto es una tarea. Con lo cual la respuesta será "pregunta a tu profesor, que para eso vas a clase".
También se te va a pedir que muestres qué llevas hecho hasta ahora, nadie por aquí te va a dar el script completo si no demuestras algo de iniciativa. Nadie te va a escribir el script completo, pero eres bienvenido a preguntar por problemas específicos de tipo "cómo recorro un vector" o "qué parametro del programa xx hace lo que necesito".


Saludos.
  #3 (permalink)  
Antiguo 05/11/2015, 02:22
 
Fecha de Ingreso: noviembre-2015
Mensajes: 2
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Una mano para un Script de Linux

Gracias por responder AlvaroG. Ya lo hice de esta manera:
#! /bin/bash
find / -name *.jpg -exec ls -l {} \; | awk '{ sum0 += $2 } END { print "- Total archivos jpg: " sum0 } { sum += $5 / 1048576 } END { print "- Tamaño archivos jpg: " sum " MB"}';

Asi para cada una de las extensiones.

En realidad no es una tarea en si, pero a la vez si lo es. Es un script que me han mandado en las practicas de la empresa, en la cual no me resuelven nada y me dejan que busque por internet a mi suerte. Como ya te he comentado antes, lo hice con find y awk, pero no era lo que pedia, ya que buscaba un array que lo hiciera. Llevo varios dias intentando meterle mano y empezar de alguna manera pero no soy capaz.

La mayor duda es el tema de los vectores ya que los "for" mas o menos los saco.

Saludos.
  #4 (permalink)  
Antiguo 05/11/2015, 10:07
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Una mano para un Script de Linux

Yo lo hubiese hecho con "du", o con stat en vez de ls, o incluso con la opción -ls de find en vez de "-exec ls -l". Pero eso son detalles, lo importante es utilizar las herramientas que ya tienes por estar corriendo en un Linux.
Lo de las múltiples extensiones lo puedes hacer con un find como el que escribí en mi anterior mensaje, haciendo uso de un -name por extensión, -o (OR) y los paréntesis para agrupar los -name

Pero hay algo que tienes que tener claro: BASH no es Java, Python, Perl, C, o el que conozcas. BASH es un lenguaje de scripting para el shell de UNIX, con lo cual la forma correcta es siempre usar las utilidades que la línea de comandos provee. En base a esto, el lenguaje tiene también limitaciones, por ejemplo:

- # Para cada fichero en vectorresultados(elemento)(extension)
BASH tiene un soporte muy básico para arrays asociativos (a partir de bash 4), si bien lo anterior es posible, la sintaxis es bastante dificultosa.

- # Definir la funcion buscarficheros (parametro directorio, vectorresultadoscarpeta)
Esto no es posible en BASH, ya que no se puede pasar vectores como parámetro a una función.

- # Si la extension del fichero esta en el vector de extensiones
No hay un "if elemento in vector" en BASH. Tendrías que programar tu propio código para verificar si un elemento pertenece al vector o no.


En sí el ejercicio me parece inútil, no veo la necesidad de luchar contra la sintaxis de un lenguaje particular solamente para implementar algo como si fuese otro lenguaje. Es claro para mí que el ejercicio lo escribió alguien que no trabaja con scripts de shell. Lo que pide (de la forma en que está pedido) es ridículamente difícil para implementar en bash comparado con escribirlo usando lo que ya tenemos disponible.

Etiquetas: linux, mano
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:20.