count arquivos em uma lista de diretórios

2

Eu tenho um arquivo com uma lista de diretórios que eu gostaria de saber quantos arquivos estão em cada diretório.

.../images/idsuffix/userids/

Isso me dará a contagem de arquivos e diretórios para os primeiros 5 diretórios em vez de para cada diretório.

find ./images/00{0..5}/ | wc

O que eu quero é contagem de conteúdo para cada diretório. Eu tentei passá-lo através de xargs, mas faz a mesma coisa e produz uma contagem para todos os diretórios.

ls ./images/ > directories.lst  
cat directories.lst | xargs -i{} find {} | wc 

E isso não produz nenhuma saída.

cat directories.lst | xargs -I{} bash -s "find {} | wc"
    
por nelaaro 22.08.2012 / 15:27

3 respostas

0

Usando sh na porção -exec do comando, você pode iniciar um outro shell e executar seus comandos lá muito bem.

find . -name "*.dat" -exec csh -c 'echo -n $1; grep ID $1 | wc -l' {} {} \;

Ou, no meu caso, ao contar arquivos em diretórios. Eu uso "ls -f", uma vez que produz a saída ls não classificada, o que é significativamente mais rápido ao tentar separar a saída antes de contar.

com nova linha entre o nome do diretório e a contagem

find /somedir/some/dir -type d -print -exec sh -c ' ls -f $1/* | wc -l' {} {} \;

A saída é semelhante a esta

/dir/somedir/002/1066002
6

com tabulação entre o nome do dir e a contagem

find /somedir/some/dir -type d -exec bash -c 'echo -en "$1\t"; ls -f $1/* | wc -l' {} {} \;

A saída é semelhante a esta

/dir/somedir/002/1066002 6

link

    
por 27.08.2012 / 13:01
5

Você pode usar um loop:

for dir in ./images/* ; do echo $dir ; ls "$dir" | wc ; done

Se você quiser incluir os arquivos de ponto, use ls -a .

Se você quiser contar arquivos em dot-dirs, use for dir in ./images/* ./images/.* .

Se houver alguns não diretórios, você poderá adicionar um teste:

for dir in ./images/* ; do
    if [[ -d $dir ]] ; then
        echo $dir
        ls "$dir" | wc
    fi
done
    
por 22.08.2012 / 15:35
2

Se você quiser ler a lista de diretórios de um arquivo, faça o seguinte:

   $ for dir in $(cat directories.lst); do echo "$dir : 'ls $dir | wc -l'"; done

Você não precisa, no entanto, do arquivo:

   $ for dir in $(find images/ -type d); do echo "$dir : 'ls $dir | wc -l'"; done

E se você quiser apenas diretórios de nível superior:

   $ for dir in $(find images/ -maxdepth 1 -type d); do echo "$dir : 'ls $dir | wc -l'"; done

Por fim, se você tiver espaços nos seus nomes de arquivos, faça o seguinte:

   $ SAVEIFS=$IFS; IFS=$(echo -en "\n\b"); for dir in $(find images/ -type d); do echo "$dir : 'ls $dir | wc -l'"; done; IFS=SAVEIFS
    
por 22.08.2012 / 15:51