![Argumentliste zu lang bei Verwendung von „du“](https://rvso.com/image/97215/Argumentliste%20zu%20lang%20bei%20Verwendung%20von%20%E2%80%9Edu%E2%80%9C.png)
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, find
anstatt ihn zu globbing und es tun
sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10
vorausgesetzt, Sie find
unterstü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 du
mehrere 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)
-L
Folgen Sie symbolischen Links sowohl beim Suchen als auch bei der Größenberechnung.-c
erhalten Sie die kumulierte Summe<()
Prozesssubstitution zur Erstellung einesfile
on-the-fly-print0
umdu
die Erwartungen zu erfüllen\( \)
-o
mit zwei-name
Argumenten 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-depth
Mö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