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.