Argumentliste zu lang bei Verwendung von „du“

Argumentliste zu lang bei Verwendung von „du“

Ich habe einen Befehl, um große Dateien in einem bestimmten Ordner zu finden, aber aus irgendeinem Grund funktioniert er in bestimmten Situationen nicht und ich erhalte die Fehlermeldung „Argumentliste zu lang“. Wie behebe ich diesen Befehl, damit er jedes Mal funktioniert?

jbsmith:/tmp$ sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/sudo: Argument list too long

Antwort1

Sie können diesen Befehl durch ersetzen, findanstatt ihn zu globbing und es tun

sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10

vorausgesetzt, Sie findunterstützen die +Notation.

Dadurch wird alles im aktuellen Verzeichnis gefunden, ohne tiefer zu gehen, und der "." wird ignoriert (danke für die Erinnerung, @rudimeier!)

Dies schließt alle Dateien im aktuellen Verzeichnis ein, wie den Glob, den Sie ursprünglich hatten. Im Gegensatz zu diesem Glob werden hiermit auch Dateien gefunden, die mit beginnen .(es sei denn, Sie haben bereits mit Ihren Shell-Optionen herumgespielt, um dies zu aktivieren dotglob).

Antwort2

Ich bin auf diese Frage gestoßen, als ich nach einer Möglichkeit suchte, mit „Argumentliste zu lang“ umzugehen du. In meinem Fall wollte ich die Ausgabe nicht filtern, sondern eine Gesamtsumme aller Dateien erhalten, die einem Muster entsprechen. Mit den Ansätzen in anderen Fragen konnte ich keine Gesamtsumme erhalten, da sie am Ende dumehrere Aufrufe mit einer Teilmenge von Argumenten ausführen.

Die Lösung bestand darin, --files0-from=anstelle der Übergabe von Dateinamen als Argumente zu verwenden.

Am Ende hat das bei mir funktioniert:

du -Lhsc --files0-from=<(find -L -maxdepth 2 \( -name "*.gz" -o -name "*.xz" \) -print0)
  • -LFolgen Sie symbolischen Links sowohl beim Suchen als auch bei der Größenberechnung.
  • -cerhalten Sie die kumulierte Summe
  • <()Prozesssubstitution zur Erstellung eines fileon-the-fly
  • -print0um dudie Erwartungen zu erfüllen
  • \( \)-omit zwei -nameArgumenten verwenden können

In gleicher Weise könnte die Antwort auf die obige Frage lauten:

du -hsx --files0-from=<(find -maxdepth 1 ! -name "." -print0) | sort -rh | head -10

Antwort3

Mit den neuesten Versionen von GNU coreutils können Sie die--max-depthMöglichkeitanstatt die Dateien mit aufzuzählen *. Auf diese Weise laufen Sie nicht Gefahr, die Befehlszeilenlängenbeschränkung zu überschreiten, wenn zu viele Dateien vorhanden sind. Es gibt kein --min-depth, daher wird das oberste Verzeichnis am Ende aufgelistet.

du -x -d 1 | head -n -1 | sort -r | head -n 10

Antwort4

sudo ls | sudo parallel -j1 du -hsx | sort -rh | head -10

verwandte Informationen