You have a file with a funny name, probably starting with a
-. Remember that globs (like
*) are expanded by your shell, not the command being run. As an example, say you have:
$ ls -1
Simple enough directory, with two files in it. (The
-1 option to coreutils
ls makes its output single-column.)
When you run
du -sh *, the shell notices that the second argument contains a special character (
*) and isn't quoted, so it does glob expansion. It expands it to everything that matches, in this case
-q. The effect is exactly as if you'd run:
$ du -sh foo -q
du: invalid option -- 'q'
Try 'du --help' for more information.
The error above is clear: GNU utilities allow options mixed with file names for convenience;
du is taking the file name
-q as an option. And there isn't a
-q option. (This is actually the best you can expect; worse would be if there were a
-q option, and it did something unwanted.)
Stépahane's suggestion is to change your glob to
./*, which would result in
du -sh ./foo ./-q—which of course is taken as a file name, because it no longer begins with
-. The other option he suggests is to use
--, which tells GNU utilities that there are no more options—only file/directory names.
Really you should always use either
… ./* or
… -- * instead of
*, but we're all lazy…. Just be careful, especially if you don't trust all the file names.