Warum beschwert sich `du -sh *` über ungültige Optionen?

7

Ich habe mein Bestes über Google gesucht, aber für mein Leben kann ich *nach einem kürzlich durchgeführten Update nicht herausfinden, was ich anstelle von (Sternchen) verwenden soll (sogar Wikipedia scheint zu denken

du -sh * and du -sh * sollte arbeiten)

Ich habe benutzt

du -sh * | sort -h

seitdem kurz vor sort die -hOption bekam (auf Fedora glaube ich, hat es eine Weile sort -hgedauert, bis ich das auf CentOS verwenden konnte), aber plötzlich * scheint eine lange Liste von auszugeben

du: invalid option -- ' '

Dabei ' 'werden alle ungültigen Optionen durchlaufen, die nicht in der Manpage aufgeführt sind.

Ich wäre sehr dankbar, wenn mir jemand sagen könnte, was das Äquivalent wäre

du -sh * | sort -h

auf den aktualisierten Versionen.

jmkane
quelle
@jmkane Ihr Befehl funktioniert auf Fedora 21
somethingSomething

Antworten:

15

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.

derobert
quelle
ok, mein Fehlerbericht wird bereits gesendet, aber ich habe einen Link zu dieser Frage hinzugefügt. Wenn also @jmkane nachsehen könnte, ob dies der Fall ist, würde es den Entwicklern helfen, zu wissen, ob sie nach einem Fehler suchen müssen oder nicht. Ich wusste das nicht, hatte nie Dateien auf meinem System, beginnend mit -, aber schön das zu wissen.
switch87
1
Beachten Sie, dass dies --nicht nur GNU, sondern auch POSIX ist und daher von den meisten duImplementierungen berücksichtigt werden sollte .
Jlliagre
Du hattest absolut recht. Ich kann du -sh * immer noch in anderen Ordnern verwenden, daher muss es etwas Neues in dem Ordner sein, den ich regelmäßig überprüft habe, aber ich kann nichts Offensichtliches sehen, und ich werde sicherstellen, dass ./* oder - * in der Zukunft.
Jmkane
0

du nimmt den Bindestrich in die Datei und nimmt ihn als Argument.

Wenn Sie '-' an den Befehl übergeben, bedeutet dies, dass keine weiteren Optionen gesendet werden. Führen Sie den Befehl daher folgendermaßen aus: du -fh - * oder du -sh - *

hat für mich gearbeitet ...

Dieser Thread hat geholfen: - http://www.webhostingtalk.com/showthread.php?t=1354139

Saumith Reddy
quelle