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.

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.

oswaldog escribió:

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-keys
    1  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/bash

TOTAL=`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.

fritto escribió:

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/bash

if (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. mrgreen

chaosklica escribió:

LOL! Una evaluación del ISEIT. mrgreen

meparto sip, pero vale no!