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 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 comoxargs
, masfind
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.