2011-06-07 10 views
8

Mi objetivo es escribir un script para buscar recursivamente a través del directorio de trabajo actual y los subdirectorios e imprimir un recuento de la cantidad de archivos comunes, un recuento de los directorios, conteo de bloques de archivos especiales , número de archivos especiales de caracteres, número de FIFO y un recuento de enlaces simbólicos. Tengo que usar pruebas de condición con [[]]. El problema es que no estoy muy seguro de cómo empezar.Cuente recursivamente archivos específicos BASH

He probado el algo como lo siguiente para buscar todos los archivos ordinarios pero no estoy seguro de cómo funciona exactamente la recursividad en secuencias de comandos BASH:

function searchFiles(){ 
    if [[ -f /* ]]; then 
     return 1 
    fi 
} 
searchFiles 
echo "Number of ordinary files $?" 

pero me da como resultado 0. Alguien ayuda con esto?

+0

¿Dónde nos encontramos la llamada recursiva? y por qué recursividad. Tenga en cuenta que solo podrá devolver un valor máximo de 255 ya que el valor de retorno está limitado por 1 byte (byte de 8 bits). – phoxis

+0

eche un vistazo a 'pushd' y' popd' – phoxis

Respuesta

38

¿Por qué no usar find?

$ # Files 
$ find . -type f | wc -l 
327 
$ # Directories 
$ find . -type d | wc -l 
64 
$ # Block special 
$ find . -type b | wc -l 
0 
$ # Character special 
$ find . -type c | wc -l 
0 
$ # named pipe 
$ find . -type p | wc -l 
0 
$ # symlink 
$ find . -type l | wc -l 
0 
+0

Me encantaría, pero se nos dice que usemos específicamente la condición. Pero intentaré salir de esto. – jamesy

+0

"se nos dice que ... ¿como en esto es una tarea? – Amanda

+0

@Amanda: * esto es una tarea "- Dado que esto fue hace más de un año, creo que el tiempo pasado sería más apropiado. – MattH

3

Algo para empezar:

#!/bin/bash 

directory=0 
file=0 
total=0 

for a in * 
do 
    if test -d $a; then 
     directory=$(($directory+1)) 
    else 
     file=$(($file+1)) 
    fi 

    total=$(($total+1)) 
    echo $a 

done 

echo Total directories: $directory 
echo Total files: $file 
echo Total: $total 

Sin recursividad aquí, sin embargo, para los que se puede recurrir a ls -lR o similares; pero de nuevo, si va a utilizar un programa externo, debe recurrir al uso de find, para eso está diseñado.

+1

en lugar de '*' use '**' para la recursión. 'Shopt globstar' tiene que estar * en * para que esto funcione. (' Shopt -s globstar' para habilitar) – kon

Cuestiones relacionadas