Oracle Linux 6.7 -bash: /usr/bin/du: Argumentliste zu lang

Oracle Linux 6.7 -bash: /usr/bin/du: Argumentliste zu lang

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 xargsmit diesem Befehl kombinieren oder wird xargsmein 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/exportsenthä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 -mindepthvermeidet die Ausführung des duBefehls für /data/dataold/exportsund -maxdepthvermeidet 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 finddies 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;findduvielSchneller.

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 dukann man die anzuzeigende Tiefe mit der Option -doder 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 dufü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 duOption nicht unterstützt, -dkö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 outputfilespäter verarbeiten.

Beispiel:

awk '$1 > 20e9` outputfile

Wenn Ihre duOption diese nicht unterstützt, -dkö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/exportsund druckt eg, /data/dataold/exports/fooaber nicht eg /data/dataold/exports/foo/bar.

Antwort2

Versuchen Sie nicht, zusammenzufassen, sondern lassen Sie dudie Arbeit machen. Wenden Sie es sortmit -heiner bestimmten Reihenfolge an und begrenzen Sie es dann auf eine bestimmte Größe:

du -h /data/dataold/exports/ | sort -h

Verwenden Sie -res sortzum Auflisten in umgekehrter Reihenfolge, also von großen nach kleinen Dateien.

Zur Auswahl der Größe awkgenü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.

verwandte Informationen