La práctica consiste en realizar un programa en lenguaje C al
que llamaremos mostrar
y
que debe servir para mostrar información sobre ficheros o
directorios de un modo similar a
como lo hace el comando ls,
permitiendo además establecer una condición o filtro
sobre los archivos que se desean mostrar. El
programa funcionará con las siguientes opciones:
$ mostrar [-d <nombredir>] <condicion> [<condicion> ...]
donde
- <nombredir> indica un
nombre
que corresponderá al directorio desde donde se iniciará
la búsqueda. Si no se especifica <nombredir> se
entenderá por defecto que la búsqueda comenzará en
el directorio actual "."
- Los ficheros a mostrar en el resultado deben cumplir al menos una
de las condiciones que aparecen en la llamada del comando.
Nótese que siempre es obligatoria al menos una condición.
Cada <condicion>
es una conjunción de comparaciones que sigue el formato:
'<comparacion1> & <comparacion2> & ... & <comparacionN>'
donde N es un
número mayor que cero. Una comparación puede ser,
la palabra TRUE o una
expresión del estilo:
<atributo>
<relación> <valor>
Un
<atributo>
será simplemente una letra que indica alguno de los atributos
del archivo, siguiendo el siguiente código
n
nombre del archivo
s tamaño
del archivo
g grupo
u usuario
b número
de bloques
m fecha
de última modificación
Una
<relación>
relación puede ser alguno de los símbolos
=, >, <,
>=, <= con su significado habitual, además de
!= que
significa "distinto de". En el caso de los atributos
s, b el
<valor>
será numérico. Para los atributos
n, g, u el
<valor>
es cualquier cadena de caracteres (exceptuando los caracteres
' ni
& ni
espacio en blanco). Para el atributo fecha de modificación
m, el
valor será una fecha válida con formato
dd/mm/aaaa.
El programa hará una búsqueda recursiva por todos los
subdirectorios del directorio especificado en
<nombredir>,
realizando un recorrido en profundidad.
Ejemplos:
- Mostrar todos los archivos que cuelgan del directorio practicas cuyo
tamaño supere los 500 bytes, su fecha de modificación es
anterior al 1 de julio de 2009 y su usuario no es el root.
$ mostrar -d practicas
's>500 & m<=01/07/2009 & u!=root'
- Mostrar todos los archivos que cuelgan del directorio raíz
y cuyo usuario es 'juan', 'ana' o 'pedro'
$ mostrar -d / 'n=juan'
'n=ana' 'n=pedro'
- Mostrar los archivos que cuelgan del directorio actual, con
nombre entre 'a' y 'c' o bien que tengan menos de 10 bloques
$
mostrar 'n>=a &
n<=c' 'b<10'
Funciones a usar
Las siguientes funciones realizan llamadas al sistema que
serán de utilidad:
- La información de cada fichero se obtiene con stat
o lstat.
- Para obtener el listado de los ficheros de un directorio deben
usarse las funciones opendir,
readdir
y
closedir .
- Los nombres de los usuarios, a partir del login pueden obtenerse
con
getpwuid
y los del grupo con
getgrgid.
- El lugar apuntado por un enlace simbólico puede obtenerse
con o realpath.
- La fecha puede convertirse a formato cadena con o
ctime.
La práctica se
realizará de forma individual o en grupos de dos
personas, siendo preferible esto último. La presentación
de la práctica tendrá lugar preferentemente en el
laboratorio durante el
horario de clase y, en el caso de los grupos, es obligatoria la
presencia de los dos alumnos que lo componen.
La práctica es obligatoria
y, por tanto, aprobarla
es imprescindible para aprobar la asignatura. La puntuación de
la práctica es de un máximo de 0.7 puntos, si se entrega
dentro de plazo, y un máximo de 0,4 si se entrega fuera de plazo
(inlcuyendo convocatoria de septiembre o diciembre). Una vez aprobada,
su validez comprende un período de dos años.
La entrega se realizará
utilizando
el sistema de
buzón
de prácticas. La
fecha límite de entrega de
la
práctica es el
miércoles 13
de enero de 2010, quedando
inhabilitado
el buzón al día siguiente. Tras esta fecha, se
abrirá un plazo de defensa en horario de tutorías para
aquéllas prácticas entregadas en buzón dentro de
plazo pero que excepcionalmente
no hayan sido presentadas en el laboratorio.