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.