Wie werden "lesbare" Dateigrößen in Suchergebnissen angezeigt?

11

Ich versuche, alle großen Dateien auf meinem Centos-Server zu finden. Dazu benutze ich:

find / -maxdepth 10 -size +100000 -ls

Ich habe versucht, zu wechseln -ls, -lshaber es ist nicht erlaubt.

Wie kann ich diese Ergebnisse mit lesbaren Größen anzeigen (mit den Suffixen k, M,…)?

blarg
quelle
Was ist Ihre Definition für lesbar? Für mich ist das menschlich lesbar genug.
Manatwork
Sie sollten das fileDienstprogramm mit versuchen find.
Ramesh
@ Manatwork kb, mb, gb
blarg

Antworten:

10

findhat keine ausgeklügelten Optionen wie ls. Wenn Sie möchten ls -h, müssen Sie anrufen ls.

find / -maxdepth 10 -size +100000 -exec ls -lh {} +

Ich empfehle die -xdevOption, ein erneutes Auftreten in andere Dateisysteme zu vermeiden. Dies wäre nutzlos, wenn Sie sich Gedanken über den Speicherplatz machen.

find / -xdev -maxdepth 10 -size +100000 -exec ls -lh {} +

Wenn Sie zsh als Shell verwenden find, können Sie anstelle von glob Glob-Qualifizierer verwenden. Das Begrenzen der Dateigröße ist einfach: Lgefolgt von einer Größe; Die Größe kann eine optionale Einheit vor der Nummer haben. Wenn Sie sich nicht für die maximale Tiefe **/interessieren , können Sie in Unterverzeichnisse zurückgreifen. Wenn Sie sich für maximale Tiefe interessieren, ist dies umständlicher, da zsh-Glob-Muster keine Möglichkeit bieten, „höchstens n Vorkommen“ auszudrücken . Verwenden Sie das dGlob-Qualifikationsmerkmal, um eine geräteübergreifende Rekursion zu vermeiden . Sie müssen die Gerätenummer finden, die Sie mit dem anzeigen könnenstat Befehl unter Linux ( stat -c %d /um nur die Nummer anzuzeigen) oder mit dem von zsh selbst stateingebauten Gerät ( zmodload zsh/statzum Laden ausführen ) anzeigen können.

ls -lh /**/*(L+M99d$(stat -c %d /))
Gilles 'SO - hör auf böse zu sein'
quelle
4

Der Befehl, den Sie versuchen, ist für mich lesbar. Sie können jedoch das Dateidienstprogramm mit der folgenden Suche verwenden.

find / -maxdepth 10 -size +100000 -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print

Eine andere Möglichkeit, dies zu tun, ist die Verwendung des folgenden Befehls.

du -BM / | sort -nr

Mit dem obigen Befehl erhalten Sie die Dateien in der sortierten Dateigröße.

Wenn Sie coreutils> 7.5 verwenden , können Sie den folgenden Befehl ausführen, um die Dateien nach Größen aufzulisten.

du -ah / | grep -v "/$" | sort -h

In meiner Maschine hatte ich das nicht sort -h Option nicht verfügbar.

Wie Sie im Kommentar erwähnt hatten, ist Ihr lesbares Format, dass die Datei die Größe in KB , MB oder GB haben sollte . Ich würde mit dem zweiten Befehl gehen, den ich als Antwort gepostet hatte. Die Ausgabe, die ich erhielt, als ich sie in meinem System verwendete, ist:

du -BM /home/ramesh/chk1/ | sort -nr

50M     /home/ramesh/chk1/
21M     /home/ramesh/chk1/Hierarchical_Clustering_Working
3M      /home/ramesh/chk1/checking_files
1M      /home/ramesh/chk1/checking/checking2
1M      /home/ramesh/chk1/checking/checking1
1M      /home/ramesh/chk1/checking/asdf
1M      /home/ramesh/chk1/checking
Ramesh
quelle
Gibt es eine Möglichkeit, eine Untergrenze für Ihren zweiten Befehl festzulegen? Die größten Dateien erscheinen oben und verschwinden schnell von der Oberseite der Shell. BEARBEITEN - Ich sehe, Sie müssen nur den r
blarg
Sie können die Ausgabe in eine Datei umleiten, indem Sie > outputsie dem Befehl hinzufügen . Dann können Sie die Datei öffnen und die Ausgabe anzeigen, wie Sie möchten :)
Ramesh
Ich sehe, dass dies auch Ordner anzeigt, während ich nur nach Dateien bin
blarg
du -a --max-depth=10 / | sort -rnist der Abschluss, den ich mir einfallen lassen könnte. In diesem Fall wird die Größe jedoch nicht in KB, MB oder GB angezeigt.
Ramesh
1

Ich denke, was Sie suchen, ist eher wie folgt.

find / -maxdepth 10 -size +100000 -exec ls -lah {} + 

Mit -execkönnen Sie einen Befehl ausführen und das {}wird durch das Ergebnis der Suche ersetzt. Zuletzt +ist zu sagen, dass es das Ende des Befehls ist und es erforderlich ist.

Tim Hughes
quelle
2
Es ist in der Tat völlig unnötig, das {}hier zu zitieren . Die einfachen Anführungszeichen im Befehl gelten für die Shell, aber die Shell wird den ls -lah <args...>Befehl niemals sehen - sie sieht {}, was nicht in Anführungszeichen gesetzt werden muss. Es ist das find, was das sieht ls -lah {}und es ist das find, was das erweitert {}und, wie durch den Namen der -execOption impliziert , findeinen exec*Systemaufruf für die Argumente direkt verwendet, sodass es keine Probleme mit Leerzeichen gibt, da findkeine Wortaufteilung durchgeführt wird auf Ihren Dateinamen.
jw013
1
Die -aOption to lsist nicht erforderlich, da erwartet wird, dass die Argumente Dateien und keine Verzeichnisse sind. GNU findet Verwendungen ls -dilsfür die -lsOption, um dies so genau wie möglich zu replizierenls -dilsh .
jw013
Mann Fund gibt folgende für das erste Beispiel für die Verwendung -exec : find . -type f -exec file '{}' \; Läuft Datei für jede Datei in oder unterhalb des aktuellen Verzeichnisses. Beachten Sie, dass die geschweiften Klammern in einfache Anführungszeichen eingeschlossen sind, um sie vor der Interpretation als Interpunktion für Shell-Skripte zu schützen. Das Semikolon wird in ähnlicher Weise durch die Verwendung eines Backslash geschützt, obwohl auch in diesem Fall einfache Anführungszeichen verwendet werden könnten.
Tim Hughes
1
Die Manpage befürwortet lediglich unnötige Vorsicht. Es wird nicht weh tun, aber mir ist keine Shell bekannt, die {}zitiert werden muss.
jw013