Contando arquivos nas folhas da árvore de diretórios

4

Eu criei o seguinte snippet para contar arquivos em cada subdiretório:

for x (**/*(/)); do print $x; find $x -maxdepth 1 -type f | wc -l; done

O comando gera pares consecutivos (um abaixo do outro) da seguinte forma:

directory_name
# of files

Eu gostaria de alterar o código acima para:

  • Imprima cada correspondência na mesma linha (por exemplo, directory_name ':' # of files )
  • Apenas contará arquivos se as pastas forem folhas na árvore de diretórios (ou seja, elas não tiverem nenhuma subpasta).

Como posso fazer isso?

    
por Amelio Vazquez-Reina 17.10.2011 / 22:15

2 respostas

3

tente isto:

for dir in $( gfind . -type d -print ); do files=$( find $dir -maxdepth 1 -type f | wc -l ); echo "$dir : $files"; done

ou, em um script, onde você pode ter um pouco mais de flexibilidade:

#!/usr/bin/ksh

# pass in the directory to search on the command line, use $PWD if not arg received
rdir=${1:-$(pwd)}

# if $rdir is a file, get it's directory
if [ -f $rdir ]; then
    rdir=$(dirname $rdir)
fi

# first, find our tree of directories
for dir in $( gfind $rdir -type d -print ); do
    # get a count of directories within $dir.
    sdirs=$( find $dir -maxdepth 1 -type d | wc -l );
    # only proceed if sdirs is less than 2 ( 1 = self ).
    if (( $sdirs < 2 )); then 
        # get a count of all the files in $dir, but not in subdirs of $dir)
        files=$( find $dir -maxdepth 1 -type f | wc -l ); 
        echo "$dir : $files"; 
    fi
done

Eu uso o ksh para scripts de shell, mas funciona bem com #!/usr/bin/zsh ou /usr/bin/bash .

    
por 18.10.2011 / 00:18
2

rápido 'n' sujo

find . -type d | \
while IFS= read -r d; do
    f=$(ls -F "$d");
    echo "$f" | egrep -q "/$" || \
        echo $d : $(echo -n "$f"|wc -l) files;
done
    
por 19.10.2011 / 00:19

Tags