Como listar TODOS os diretórios de acordo com seu tamanho? [sem incluir o diretório pai]

6

Eu tenho um monte de pastas aleatórias, algumas delas estão escondidas (começando com um período). Eu quero listar todos eles, classificados por seus tamanhos.

Eu tenho algo em mente com isso:

ls -d -1 -a */ | xargs du -s | sort

Mas a parte ls ... não mostra arquivos ocultos. Eu sei que algumas perguntas foram feitas antes sobre o mesmo tópico, mas as respostas nunca incluem uma maneira de incluir arquivos ocultos. Ou se isso acontecer, ele usa o formato longo, tornando a saída incompatível com o restante do comando.

    
por Karthick 01.08.2011 / 16:45

2 respostas

12

A análise da saída de ls é sempre problemática . Você deve sempre usar uma ferramenta diferente se quiser processar a saída automaticamente.

No seu caso particular, seu comando estava falhando - não por causa de algum argumento ausente ou incompatível com ls - mas por causa do glob que você estava enviando. Você estava pedindo a ls para listar todos os resultados, incluindo os ocultos com -a , mas você solicitou prontamente que listasse apenas as coisas que correspondiam ao padrão */ glob, o que não combina as coisas começando com . e qualquer coisa que ls poderia ter feito estava restrito a coisas que correspondiam ao glob. Você poderia ter usado .*/ como uma segunda glob para corresponder a diretórios ocultos também, ou você poderia ter deixado o glob off completamente e apenas deixar ls fazer o trabalho. No entanto, você nem precisa de ls para isso se tiver uma glob para corresponder.

Uma solução seria pular o ls inteiramente e usar apenas o globo oculto: *

$ du -s */ .*/ | sort -n

Outra forma que pode ser um exagero para este exemplo, mas é muito poderosa em situações mais complexas, seria usar find : *

$ find ./ -type d -maxdepth 1 -exec du -s {} + | sort -n

Explicação:

  • find ./ inicia uma operação de localização no diretório atual. Você poderia usar outro caminho se quiser.
  • -type d encontra apenas coisas que são diretórios
  • -maxdepth 1 diz apenas para encontrar diretórios no diretório atual, não para recorrer a subdiretórios.
  • -exec [command] [arguments] {} + funciona muito como xargs , mas find consegue fazer todo o trabalho pesado quando se trata de citar e escapar de nomes. O {} bit é substituído pelos resultados da pesquisa.
  • du -s você sabe

* Observe que usei o operador -n para sort para obter uma classificação numérica que é mais útil do que alfabética nesse caso.

    
por 01.08.2011 / 16:51
8

Em zsh, use o qualificador D glob para incluir arquivos de ponto em um padrão de nome de arquivo:

du -s -- *(D) | sort -k1n

No bash, defina a opção dotglob para tornar * arquivos de pontos correspondentes:

shopt -s dotglob
du -s -- * | sort -k1n

Em ksh, defina FIGNORE para .?(.) para ignorar apenas . e .. e não outros arquivos de ponto.

FIGNORE='.?(.)'
du -- * | sort -k1n

Veja também Como você move todos os arquivos (incluindo ocultos) de um diretório para outro? .

    
por 01.08.2011 / 23:32