Sie haben eine Datei mit einem lustigen Namen, wahrscheinlich beginnend mit a -. Denken Sie daran, dass Globs (wie *) durch Ihre Shell erweitert werden und nicht durch den ausgeführten Befehl. Angenommen, Sie haben:
$ ls -1
foo
-q
Einfach genug Verzeichnis mit zwei Dateien. (Die -1Option zu coreutils lsmacht die Ausgabe einspaltig.)
Wenn Sie ausführen du -sh *, stellt die Shell fest, dass das zweite Argument ein Sonderzeichen ( *) enthält und nicht in Anführungszeichen steht, sodass die Glob-Erweiterung ausgeführt wird. Es erweitert es auf alles, was passt, in diesem Fall foound -q. Der Effekt ist genau so, als würden Sie ausführen:
$ du -sh foo -q
du: invalid option -- 'q'
Try 'du --help' for more information.
Der obige Fehler ist klar: GNU-Dienstprogramme erlauben der Einfachheit halber Optionen, die mit Dateinamen gemischt werden. dunimmt den Dateinamen -qals Option. Und es gibt keine -qOption. (Dies ist tatsächlich das Beste, was Sie erwarten können. Schlimmer wäre es, wenn es eine -qOption gäbe , und es hat etwas Unerwünschtes bewirkt.)
Stépahanes Vorschlag ist, Ihren Globus in zu ändern ./*, was dazu führen würde du -sh ./foo ./-q- was natürlich als Dateiname verwendet wird, da er nicht mehr mit beginnt -. Die andere Option, die er vorschlägt, ist die Verwendung --, die den GNU-Dienstprogrammen mitteilt, dass es keine weiteren Optionen gibt - nur Datei- / Verzeichnisnamen.
Eigentlich solltest du immer entweder … ./*oder … -- *anstelle von verwenden *, aber wir sind alle faul ... Seien Sie vorsichtig, insbesondere wenn Sie nicht allen Dateinamen vertrauen.
du -sh ./*oderdu -sh -- *