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 . 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 dencontra apenas coisas que são diretórios -
-maxdepth 1diz apenas para encontrar diretórios no diretório atual, não para recorrer a subdiretórios. -
-exec [command] [arguments] {} +funciona muito comoxargs, masfindconsegue fazer todo o trabalho pesado quando se trata de citar e escapar de nomes. O{}bit é substituído pelos resultados da pesquisa. -
du -svocê 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.