Como posso usar find
para gerar uma lista de diretórios que contêm o maior número de arquivos. Eu gostaria que a lista fosse do maior para o menor. Eu gostaria apenas que a listagem chegasse a 1 nível de profundidade e, normalmente, executava esse comando a partir do topo do meu sistema de arquivos, ou seja /
.
21
Respostas:
Usando ferramentas GNU:
Isso usa dois
find
comandos. O primeiro localiza diretórios e os canaliza para umwhile
loop executa a próxima localização para cada diretório. O segundo lista todos os arquivos / diretórios filhos no primeiro nível enquanto osgrep
conta. Ogrep
permite-print0
ser usado com a segunda localização, poiswc
não possui um-z
equivalente. Isso impede que nomes de arquivos com uma nova linha sejam contados duas vezes (embora usarwc
e não-print0
não faça muita diferença).O resultado do segundo
find
é colocado no argumento paraecho
que ele e o nome do diretório possam ser facilmente colocados na mesma linha (a$(..)
construção apara automaticamente a nova linha no final degrep
). As linhas são classificadas por número e os 50 maiores números mostrados comhead
.Observe que isso também incluirá os diretórios de nível superior dos pontos de montagem. Uma maneira simples de contornar isso é usar uma montagem de ligação e, em seguida, usar o diretório da montagem. Para fazer isso:
Uma solução mais portátil usa uma instância de shell diferente para cada diretório (também respondida aqui ):
Saída de amostra:
fonte
UPDATE: Fiz tudo isso abaixo, o que é legal, mas criei uma maneira melhor de classificar diretórios pelo uso de inode:
E se você quiser permanecer no mesmo sistema de arquivos, faça:
Aqui está um exemplo de saída:
AGORA COM LS:
Várias pessoas mencionaram que não possuem coreutils atualizados e a opção --inodes não está disponível para eles. Então, aqui está o sl:
Isso está me fornecendo resultados praticamente idênticos ao
du
comando:DU:
LS:
Eu acho que a
include
coisa depende apenas de qual diretório o programa parece primeiro - porque eles são os mesmos arquivos e têm links físicos. Tipo como a coisa acima. Eu posso estar errado sobre isso - e congratulo-me com a correção ...O método subjacente a isso é que eu substituo cada um dos
ls
nomes de arquivos pelo nome de diretório que contém emsed.
Seguindo a partir disso ... Bem, eu também sou um pouco confusa. Tenho certeza de que está contando com precisão os arquivos, como você pode ver aqui:DU DEMO
Faça um diretório de teste:
Alguns diretórios filhos:
Faça alguns arquivos:
Alguns hardlinks:
Veja os hardlinks:
Eles são contados sozinhos, mas sobe um diretório ...
Em seguida, executei meu script de baixo e:
E Graeme's:
Então, acho que isso mostra que a única maneira de contar inodes é por inode. E como contar arquivos significa contar inodes, você não pode contar inodes duplamente - contar arquivos com inodes com precisão não pode ser contado mais de uma vez.
VELHO:
Acho isso mais rápido e é portátil:
Não é necessário
-exec
para todos os diretórios - ele usa apenas osh
processo one ell e onefind
. Ainda tenho oset -- $glob
direito de incluir.hidden
arquivos e tudo mais, mas é muito próximo e muito rápido. Você entrariacd
em qualquer diretório raiz para a verificação e pronto.Aqui está uma amostra da minha saída executada em
/usr
:Também uso
sed
na parte inferior para apará-lo para os 50 melhores resultados.head
seria mais rápido, é claro, mas também aparo cada linha, se necessário:É rude, é verdade, mas foi um pensamento. Outro dispositivo bruto que eu uso é despejar
2>stderr
para ambosfind
ecd
para dentro2>/dev/null
. É mais limpo do que procurar erros de permissão em diretórios que não consigo ler sem acesso root - talvez eu deva especificar issofind
. Bem, é um trabalho em andamento.Ok, então eu corrigi os globs do shell assim:
Na verdade, eu ia fazer uma pergunta sobre como isso poderia ser feito, mas, enquanto digitava o título da pergunta, o site me indicou uma pergunta relacionada sugerida , onde eis que Stephane já pesava . Então isso foi conveniente. Aparentemente,
[^.],
embora seja bem suportado, não é portátil e você deve usar o!bang.
que achei no comentário de Stephane lá.Enfim, apenas puxar arquivos ocultos não era suficiente, obviamente. Então eu tenho que fazer o
set
dobro para evitar procurar posicionais pelo literal$glob
. Ainda assim, ele não parece afetar o desempenho e adiciona todos os arquivos no diretório de maneira confiável.fonte
ls -i
e ... eu acho ... provavelmentegrep
... talvez - bem, você está usando o-xdev,
que é um começo ...uniq
esort
?du
você está executando? Meudu
não tem--inodes
opção.Por que não usar algo como KDirStat Embora tenha sido originalmente escrito para o KDE, mas também funciona bem com o GNOME Ele oferece uma melhor visualização do número de arquivos / diretórios e do uso respectivo na GUI
fonte