Por que 'du -sh *' reclama de opções inválidas?

7

Eu pesquisei o meu melhor através do Google, mas pela minha vida não consigo descobrir o que usar em vez de * (asterisco) depois de uma atualização recente (até mesmo a Wikipedia parece pensar

du -sh * and du -sh * deve funcionar)

Eu usei

du -sh * | sort -h

desde pouco antes de o sort ter a opção -h (no Fedora eu acho, demorou um pouco para eu poder usar o sort -h no CentOS), mas de repente * parece mostrar uma longa lista de

du: invalid option -- ' '

em que ' ' passa por todas as opções inválidas não mencionadas na página do manual.

Eu ficaria muito grato se alguém pudesse me dizer qual seria o equivalente de

du -sh * | sort -h

nas versões atualizadas.

    
por jmkane 07.04.2015 / 22:01

1 resposta

12

Você tem um arquivo com um nome engraçado, provavelmente começando com - . Lembre-se que globs (como * ) são expandidos pelo seu shell, não o comando sendo executado. Por exemplo, digamos que você tenha:

$ ls -1
foo
-q

Diretório simples, com dois arquivos. (A opção -1 para coreutils ls faz sua saída de coluna única.)

Quando você executa du -sh * , o shell percebe que o segundo argumento contém um caractere especial ( * ) e não é citado, portanto, faz a expansão glob. Ele expande para tudo que corresponda, neste caso foo e -q . O efeito é exatamente como se você tivesse executado:

$ du -sh foo -q
du: invalid option -- 'q'
Try 'du --help' for more information.

O erro acima é claro: utilitários GNU permitem opções misturadas com nomes de arquivos por conveniência; du está levando o nome do arquivo -q como uma opção. E não há uma opção -q . (Isso é realmente o melhor que você pode esperar; o pior seria se houvesse uma opção -q e fizesse algo indesejado.)

A sugestão de Stépahane é mudar seu glob para ./* , o que resultaria em du -sh ./foo ./-q - o que, obviamente, é considerado um nome de arquivo, porque não começa mais com - . A outra opção que ele sugere é usar -- , que diz aos utilitários GNU que não há mais opções - apenas nomes de arquivos / diretórios.

Realmente, você deve sempre usar … ./* ou … -- * em vez de * , mas somos todos preguiçosos…. Apenas tenha cuidado, especialmente se você não confiar em todos os nomes de arquivos.

    
por 07.04.2015 / 23:36