listar pastas pelo número de arquivos recursivamente

5

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

O Baobab classifica as pastas pelo tamanho total. Estou procurando uma ferramenta que lista as pastas pelo número total de arquivos.

A razão pela qual estou procurando é porque copiar dezenas de milhares de arquivos pequenos é terrivelmente lento (muito mais lento que copiar alguns arquivos grandes do mesmo tamanho), então eu quero arquivar ou excluir essas pastas com altas contagens de arquivos que serão abrandar a cópia (não vai acelerar as coisas agora, mas seria mais rápido quando eu precisar movê-lo / copiá-lo novamente no futuro).

Lie Ryan
fonte
Nota para os que respondem a essa pergunta: Lie está realmente procurando por um gerenciador de arquivos / navegador, um aplicativo GUI, não um script, como a maioria das pessoas pensaria ao ler a pergunta.
CarlF 19/08/11
Um truque comum para copiar muitos arquivos pequenos é não copiá-los como muitos, mas como um. Por exemplo, usando tar ou cpio, assim: tar cf - | ssh myotherbox tar xvf -
Konrads
@ Konrads: estou copiando para / de um disco rígido externo para minha unidade local.
Lie Ryan
Atenciosamente, no futuro: se você estiver usando algum tipo de cloudsync (Dropbox, por exemplo), o Baobab com contagem de arquivos em vez do tamanho do arquivo seria legal. Acho que vou postar uma solicitação de recurso lá. // Ou sou corajoso e codifico o recurso para mim.
Phresnel #

Respostas:

2

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

Captura de tela do JDiskReport

ss # 1

Raio
fonte
JDiscReport faz o trabalho, a configuração padrão lista o tamanho do arquivo, mas se você "Exibir> Mostrar número de arquivos", ele será listado por contagem de arquivos.
Lie Ryan
6

No Shell: liste os diretórios ordenados pela contagem de arquivos (consulte o artigo para obter explicações):

Uma linha (para o diretório inicial):

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

Um roteiro :

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
harrymc
fonte
Não me importo com a ferramenta de linha de comando, mas preferiria que a ferramenta me permitisse navegar na árvore de diretórios; portanto, se eu começar de / que possui um total de 10000 pastas / arquivos, poderei detalhar até / usr / 1000 pasta / arquivos, etc, sem recontar os subdiretórios.
Lie Ryan
Então você está procurando uma ferramenta, em vez de um script.
harrymc
Fantástico! Trabalhou no Android através do shell, onde outros falharam.
Kevin Parker
5

Eu tinha certeza de que havia uma maneira de fazer isso com um script, então eu descobri.

Se você criar 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 da seguinte maneira:

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

Em seguida, seu arquivo de saída terá todos os subdiretórios listados com o número de arquivos logo após (número mais alto 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 :(

bfhd
fonte
Não me importo com a ferramenta de linha de comando, mas preferiria que a ferramenta me permitisse navegar na árvore de diretórios; portanto, se eu começar de / que possui um total de 10000 pastas / arquivos, poderei detalhar até / usr / 1000 pasta / arquivos etc.
Lie Ryan
1
As substituições devem ser citadas, como a seguir. Caso contrário, você terá problemas para diretórios que contêm espaços, etc .: ls -A "$ DIR" | echo "$ DIR" $ (wc -w); concluído
jonathan
2

Tente o seguinte:

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

Aqui está 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), encontre 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 produzidas.
  3. Para cada diretório encontrado em (1), imprima seu caminho (relativo a onde você está agora), juntamente com o número de arquivos encontrados nele, determinado em (2). Coloque dois pontos entre eles.
  4. Classifique a lista de diretórios, classificando o segundo campo (campos divididos por dois pontos) numericamente. Portanto, apresente os diretórios com mais arquivos por último na saída.

O diretório atual, representado por ., aparecerá por último, como o nó raiz da árvore.

O algoritmo é ruim, mas ele faz o trabalho que eu acho, e é executado muito rapidamente de qualquer maneira, por isso acho aceitável como um hack rápido para uso no mundo real.

Chris Poole
fonte
Você pode nos dizer como esse comando funciona?
Tamara Wijsman
@ Tom: sim, seria uma boa ideia. Eu editei minha resposta.
Chris Poole
2
Recebo bash: syntax error near unexpected token ; ' `
Adam Parkin
2
@AdamParkin retira ponto e vírgula após odo
tjmcewan
esse comando é um pouco lento para um grande diretório (mais de 100.000 arquivos), mas é incrível! Classifica pastas por tamanho de contagem de arquivos! Obrigado Chris Poole!
Andy H
0

Experimente estas duas alternativas -

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

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

Resultado -

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 da árvore, use -

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

Resultado -

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
bryan
fonte