Script de la shell que me permita contar los ficheros que contenga un directorio agrupados por su tipo
Buenas a todos, se me pide un script de la shell que me permita contar los ficheros que contenga un directorio agrupados por su tipo y al final una suma de todos los ficheros disponibles en ese directorio. Por ejemplo, dada una ruta al shell script el me contabilice los ficheros de este modo:
Archivos Regulares = 10
Archivos Directorios = 2
Archivos Bloques = 1
Archivos Caracteres = 3
Total de Archivos = 16
Revisando no pude encontrar un comando que me indicara con exactitud el tipo de fichero al que por esta clasificación pertenece, la mas cercana fue la orden: stat pero me gustaría saber de la estructura de datos que este comando detalla como obtener el del tipo de fichero. Se que esta orden dispone de unas macros posix pero no se como usarlas en un shell script, las referencias que pude encontrar en la web son para usarlas en scripts de C. El script deseo hacerlo solo con shell script.
En realidad me gustaría dar con la solución, así que toda la ayuda que puedan brindar sera muy agradecida.
Saludos.
- Inicie sesión o regístrese para enviar comentarios
- 986 lecturas


Oswaldo; si has avanzado en algo en tu script copialo aqui; asi algun compañero(a) Debianero te puede dar las sugerencias; pero si no has hecho nada no creo que te puedan ayudar.
saludos
Hola Oswaldo:
¿Script de C? Eso no existe. Creo que tienes que revisar la definición de script.
Sobre el script de shell (supongo que tu shell es bash), hay varios tutoriales en la red. Incluso hay uno que contiene un script tan parecido a lo que pides que te espantarías. Creo que era un howto que se llama win2linux o algo parecido...
Busca en google. O pega el código que llevas hecho para ver en que te podemos ayudar.
JuanE.
En realidad me gustaría dar con la solución, así que toda la ayuda que puedan brindar sera muy agradecida.
Hombre, pero si ya tienes todos los elementos. ¿Leíste el manual de stat? ¿Sabes algo de AWK? Lo que estás intentando hacer puede lograrse en un oneliner no particularmente rebuscado.
Un ejemplo de AWK que hace algo similar:
file -hiNF "::" *|awk -F ":: " '{split($2, l, ";"); a[l[1]]++; a["Total"]++}END{for(i in a) printf "%4d %s\n",a[i],i|"sort -n"}'Su resultado:
1 application/pgp-keys1 application/vnd.ms-office
1 application/x-compress
1 application/x-empty
1 application/x-tar
1 audio/midi
1 text/rtf
1 text/x-c
1 text/x-java
1 text/x-pascal
1 text/x-php
1 video/3gpp
2 application/postscript
2 application/vnd.oasis.opendocument.spreadsheet
2 application/x-rar
2 application/x-shockwave-flash
2 image/svg+xml
2 text/x-fortran
2 text/x-shellscript
3 application/vnd.oasis.opendocument.presentation
3 application/x-dvi
3 application/xml
3 text/x-c++
4 application/x-bzip2
4 video/mpeg
5 application/vnd.oasis.opendocument.presentation-template
5 text/x-python
6 text/html
7 application/ogg
8 image/gif
10 text/x-tex
12 application/octet-stream
14 image/png
15 application/msword
16 application/x-gzip
17 video/mp4
23 application/zip
28 text/plain
35 audio/mpeg
36 image/jpeg
75 application/x-directory
126 application/pdf
484 Total
Si tienes dudas con respecto a AWK no dudes en avisarnos. Es mi tipo de problemas favorito.
Saludos
Una pistilla....
wc -l
... de todas maneras la solución de Point es perfecta
Hola de nuevo Oswaldog:
Otra ayudadita. Lo mío no es tan elegante como el de Point to Null, pero igual sirve.
#!/bin/bashTOTAL=`ls -l | cut -d' ' -f1 | head -n -1 | wc -l`
BLOQUE=`ls -l | cut -d' ' -f1 | head -n -1 | egrep '^b' | wc -l`
CARACTER=`ls -l | cut -d' ' -f1 | head -n -1 | egrep '^c' | wc -l`
DIRECTORIOS=`ls -l | cut -d' ' -f1 | head -n -1 | egrep '^d' | wc -l`
REGULARES=$(($TOTAL-$BLOQUE-$CARACTER-$DIRECTORIOS))
echo "Archivos Regulares = $REGULARES"
echo "Archivos Directorios = $DIRECTORIOS"
echo "Archivos Bloques = $BLOQUES"
echo "Archivos Caracteres = $CARACTERES"
echo "Total de archivos = $TOTAL"
Envío esto tratando de no romper el espíritu de este foro (aprender y compartir el conocimiento por sobre todas las cosas y no de soporte técnico o de 'tonto' que te resuelve las tareas de la escuela).
JuanE.
Oswaldo; si has avanzado en algo en tu script copialo aqui; asi algun compañero(a) Debianero te puede dar las sugerencias; pero si no has hecho nada no creo que te puedan ayudar.
saludos
Buenas a todos, agradezco todos los comentarios. Antes de revisar todos los post había avanzado a esto:
#!/bin/bashif (test "$1" != "") || (`test -d $1`); then
t=0
d=0
f=0
b=0
c=0
l=0
p=0
for i in $(`ls $1`); do
if (`test -d $i`); then
let d=d+1
elif (`test -f $i`); then
let f=f+1
elif (`test -b $i`); then
let b=b+1
elif (`test -c $i`); then
let c=c+1
fi
let t=t+1
done
echo "Archivos Regulares: $f";
echo "Archivos Directorios: $d";
echo "Archivos Bloques: $b";
echo "Archivos Caracteres: $c";
echo "________________________";
echo "Total Archivos $t";
else
echo "No se puede acceder a: No existe el directorio"
fi
Sin embargo aun no esta funcionando bien. Ahora con todos sus comentarios intentare sacar lo mejor de todos a ver que resultado obtengo.
En especial por el aporte de juanE y Blogger, vale decir que no conocía la existencia del lenguaje awk
LOL! Una evaluación del ISEIT.
LOL! Una evaluación del ISEIT.