lista pastas pelo número de arquivos recursivamente

5

Existe algum aplicativo Linux para encontrar as pastas com o maior número de arquivos?

baobab classifica as pastas pelo seu tamanho total, sou procurando por uma ferramenta que lista pastas pelo número total de arquivos nela.

A razão pela qual estou procurando é porque copiar dezenas de milhares de arquivos pequenos é extremamente lento (muito mais lento do que copiar alguns arquivos grandes do mesmo tamanho), portanto, quero arquivar ou excluir essas pastas com altas contagens de arquivos isso vai diminuir a velocidade da cópia (não vai acelerar as coisas agora, mas seria mais rápido quando eu precisar mover / copiar novamente no futuro).

    
por Lie Ryan 11.08.2011 / 13:06

5 respostas

2

Experimente o JDiskReport que pode ser viável para você. FileLight é outro se você executar o KDE.

Screenshot do JDiskReport

&

    
por 24.08.2011 / 16:39
6

Em Shell: liste diretórios ordenados por contagem de arquivos (veja o artigo para explicações):

Um one-liner (para o diretório home):

find ~ -type d -exec sh -c "fc=\$(find '{}' -type f | wc -l); echo -e \"\$fc\t{}\"" \; | sort -nr

Um script:

countFiles () {
    # call the recursive function, throw away stdout and send stderr to stdout
    # then sort numerically
    countFiles_rec "$1" 2>&1 >/dev/null | sort -nr
}

countFiles_rec () {
    local -i nfiles 
    dir="$1"

    # count the number of files in this directory only
    nfiles=$(find "$dir" -mindepth 1 -maxdepth 1 -type f -print | wc -l)

    # loop over the subdirectories of this directory
    while IFS= read -r subdir; do

        # invoke the recursive function for each one 
        # save the output in the positional parameters
        set -- $(countFiles_rec "$subdir")

        # accumulate the number of files found under the subdirectory
        (( nfiles += $1 ))

    done < <(find "$dir" -mindepth 1 -maxdepth 1 -type d -print)

    # print the number of files here, to both stdout and stderr
    printf "%d %s\n" $nfiles "$dir" | tee /dev/stderr
}


countFiles Home
    
por 19.08.2011 / 09:02
5

Eu tinha certeza que há uma maneira de fazer isso com um script, então fui e descobri.

Se você fizer um script bash como este (digamos que chamamos de 'countfiles'):

#!/bin/bash
find . -type d | while read DIR; do
ls -A $DIR | echo $DIR $(wc -w);done

execute-o e canalize a saída assim:

./countfiles | sort -n -k 2,2 > output

Em seguida, o arquivo de saída terá todos os subdiretórios listados com o número de arquivos logo após (o maior número de arquivos no final).

por exemplo. executar este script como acima na minha pasta / usr mostra isso quando eu faço 'tail output'

./lib/gconv 249
./share/doc 273
./share/i18n/locales 289
./share/mime/application 325
./share/man/man8 328
./share/perl/5.10.1/unicore/lib/gc_sc 393
./lib/python2.6 424
./share/vim/vim72/syntax 529
./bin 533
./share/man/man1 711

Provavelmente, existe uma maneira melhor de fazer isso; Eu não sou muito bom em scripts bash: (

    
por 19.08.2011 / 07:12
1

Tente isto:

find . -type d | while read dir; do; echo "$dir" : $(find "$dir" -type f | wc -l); done | sort -k2 -t ':' -n 

Veja o que ele faz:

  1. Obtenha uma lista de todos os diretórios (e quaisquer subdiretórios) dentro do diretório atual.
  2. Para cada diretório encontrado em (1), localize quantos arquivos estão dentro desse diretório (e novamente, quaisquer subdiretórios), listando os arquivos e fazendo uma contagem do número de linhas geradas.
  3. Para cada diretório encontrado em (1), imprima seu caminho (relativo a onde você está agora), junto com o número de arquivos encontrados dentro dele, determinado em (2). Coloque um cólon entre eles.
  4. Classifique a lista de diretórios, classificando numericamente o segundo campo (campos divididos por dois pontos). Assim, apresente os diretórios com o maior número de arquivos no final da saída.

O diretório atual, representado por . , aparecerá por último, pois é o nó raiz na árvore.

O algoritmo é ruim, mas ele faz o trabalho que eu acho, e ele roda muito rápido de qualquer maneira, então eu acho que é aceitável como um truque rápido para o uso no mundo real.

    
por 19.08.2011 / 12:42
0

Tente estas duas alternativas -

1) Para uma saída detalhada da árvore -

 for i in $(ls -d */); do tree  $i ; done > results.txt

Saída -

c++/
|-- 4.4
|   |-- algorithm
|   |-- array
|   |-- backward
|   |   |-- auto_ptr.h
|   |   |-- backward_warning.h
|   |   |-- binders.h
|   |   |-- hash_fun.h
|   |   |-- hash_map
|   |   |-- hash_set
|   |   |-- hashtable.h
|   |   '-- strstream
|   |-- bits
|   |   |-- algorithmfwd.h
...
38 directories, 662 files


2) Para um resumo do uso da árvore -

for i in $(ls -d */); do tree $i | grep -v \-\-\  ; done

Saída -

arpa/

0 directories, 6 files

asm/

0 directories, 56 files

asm-generic/

0 directories, 34 files

bits/

0 directories, 103 files

c++/

38 directories, 662 files
    
por 22.08.2011 / 21:30