![Oracle Linux 6.7 -bash: /usr/bin/du: Argumentliste zu lang](https://rvso.com/image/192157/Oracle%20Linux%206.7%20-bash%3A%20%2Fusr%2Fbin%2Fdu%3A%20Argumentliste%20zu%20lang.png)
Ich habe einen Pfad mit etwa 1 Million Ordnern mit einer Gesamtgröße von 300 GB. Wenn ich den du -sh *
Befehl ausführe, erhalte ich den im Titel erwähnten Fehler. Wie kann ich die Verwendung xargs
mit diesem Befehl kombinieren oder wird xargs
mein Problem gelöst? Ich brauche jedoch noch einen separaten Befehl, um Ordner mit mehr als 20 GB unter demselben Pfad zu finden. Brauche Hilfe bei der Verwendung dieser beiden Befehle.
Pfadbeispiel:/data/dataold/exports/
Die Ausgabe sollte wie folgt aussehen (Sie können sich vorstellen, dass meine Angaben unten die Datei- und Ordnernamen unter dem Hauptpfad sind, den ich in der obigen Zeile angegeben habe):
4.0K xyz.sh 12K asdasda.txt 10G QWERT 1G ASDFGH
Beste grüße.
Antwort1
Eine Möglichkeit besteht darin, zu verwenden find
, ich schlage jedoch eine der anderen unten gezeigten Lösungen vor.
find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \;
Vorausgesetzt, das /data/dataold/exports
enthält die Unterverzeichnisse
foo
bar
baz
(und vielleicht mehr), es wird laufen
du -sh /data/dataold/exports/foo
du -sh /data/dataold/exports/bar
du -sh /data/dataold/exports/baz
usw.
Option -mindepth
vermeidet die Ausführung des du
Befehls für /data/dataold/exports
und -maxdepth
vermeidet dies für Unterverzeichnisse eines Unterverzeichnisses, z. B. für /data/dataold/exports/foo/something
.
Wie vorgeschlagen incas' Kommentar können Sie verwenden
find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \+
anstelle von , ... -exec du -sh {} \;
wenn Ihre Version von find
dies unterstützt. Mit +
anstelle von wird einmal ausgeführt , wenn der Linux-Argumentpuffer gefüllt ist (ca. 2 MB), anstatt einmal für jede Datei/jedes Verzeichnis. Ersteres ist;
find
du
vielSchneller.
ZitierenStéphane Chazelas' Kommentar: "Beachten Sie, dass das Aufrufen mehrerer unabhängiger Aufrufe von du
(wie bei find -exec
) unterschiedliche Zahlen ergeben kann, wenn es Hardlinks zwischen diesen obersten Verzeichnissen gibt, da sie nicht dedupliziert werden, wenn sie von verschiedenen Aufrufen von gefunden werden du
."
Bei GNU du
kann man die anzuzeigende Tiefe mit der Option -d
oder begrenzen --max-depth=N
:
du -h -d 1 /data/dataold/exports
Dadurch wird die Berechnung für alle Unterverzeichnisse durchgeführt, die Ausgabe wird jedoch auf eine Tiefe von 1 unterhalb des Startpunkts beschränkt. Im oben gezeigten Beispiel sollte also die Gesamtgröße für
/data/dataold/exports/foo
/data/dataold/exports/bar
/data/dataold/exports/baz
usw. und für
/data/dataold/exports
Die zweite Lösung ist, sofern verfügbar, vorzuziehen, da nicht du
für jedes Unterverzeichnis (im Fall von -exec ... \;
) oder für jeden Satz von Unterverzeichnissen, der den Argumentpuffer füllt (im Fall von -exec ... \+
), ein neuer Prozess gestartet werden muss.
Wenn Ihre Version von du
Option nicht unterstützt, -d
können Sie verwenden
du -h /data/dataold/exports
und filtern Sie die Ausgabe, um alles unterhalb der ersten Ebene der Unterverzeichnisse zu entfernen.
Wenn Sie die Ausgabe durch numerischen Vergleich filtern möchten, schlage ich vor, die Option wegzulassen -h
. Um beim Testen der Filterung nicht auf den langsamen Dateisystemzugriff warten zu müssen, schlage ich vor, die Ausgabe in eine Datei umzuleiten, z. B.
du -d 1 /data/dataold/exports > outputfile
oder
du -d 1 /data/dataold/exports 2>errors | tee outputfile
und den Inhalt outputfile
später verarbeiten.
Beispiel:
awk '$1 > 20e9` outputfile
Wenn Ihre du
Option diese nicht unterstützt, -d
können Sie etwas wie
du /data/dataold/exports > outputfile
awk '$1 > 20e9 && $1 != /\/.*\/.*\/.*\/.*\/.*/` outputfile
Dies druckt alle Zeilen, die im ersten Feld eine Zahl größer als 20 * 10^9 und im zweiten Feld einen Wert haben, der nicht 5 (oder mehr) Schrägstriche enthält. Die Anzahl der Schrägstriche in der zweiten Bedingung ist auf das Startverzeichnis zugeschnitten /data/dataold/exports
und druckt eg, /data/dataold/exports/foo
aber nicht eg /data/dataold/exports/foo/bar
.
Antwort2
Versuchen Sie nicht, zusammenzufassen, sondern lassen Sie du
die Arbeit machen. Wenden Sie es sort
mit -h
einer bestimmten Reihenfolge an und begrenzen Sie es dann auf eine bestimmte Größe:
du -h /data/dataold/exports/ | sort -h
Verwenden Sie -r
es sort
zum Auflisten in umgekehrter Reihenfolge, also von großen nach kleinen Dateien.
Zur Auswahl der Größe awk
genügt ein einfacher Trick:
du -h /data/dataold/exports/ | awk -F'G' '$1~/^[0-9]+$/ && $1>=20' | sort -h
Beispiel: Verwenden Sie G
(aus der Ausgabe in GB-Größe) als Feldtrennzeichen, prüfen Sie, ob das Feld nur eine Zahl ist (um falsche Übereinstimmungen mit dem G-Trennzeichen auszuschließen) und wählen Sie dann nur Zahlen größer als 20 aus. Die Sortierung ist hier optional.