Wie kann ich alle Dateien und Ordner auflisten, die eine bestimmte Größenbeschränkung überschreiten?

7

In einer Partition habe ich mehrere Dateien und Ordner, und ich kann alle diese Dateigrößen duwie folgt auflisten :

du -h

Aber wie kann ich alle Dateien auflisten, die über eine bestimmte Speicherplatzgröße wie 5 MB hinausgehen?

rɑːdʒɑ
quelle
3
Verwenden Sie findfind /path -type f -size +5M -exec ls -lh {} \;
Terry Wang

Antworten:

0

Hier ist eine einfache Lösung in bash, die die Größe von Dateien und Ordnern analysiert:

#!/bin/bash

folder="$1"
limit="$2"

IFS=$'\n'
for item in `find "$folder"`; do
    size=$(du -s "$item" | cut -f1)
    if [ $size -gt $limit ]; then
        echo $item
    fi
done

Der erste Parameter ist der zu untersuchende
Zielordner. Der zweite Parameter ist die Grenze in Kilobyte, wobei 1 KB = 1024 Byte ist.

Pavel A.
quelle
Hallo, gerade jetzt habe ich das gesehen, ich werde versuchen, es dich wissen zu lassen.
rɑːdʒɑ
Nun, ich bekomme diese Fehler, Bruder. .Moviz / s.sh: 9: [: -gt: unerwarteter Operator du: kann nicht auf `ter 'zugreifen: Keine solche Datei oder kein solches Verzeichnis Aber die Dinge waren tatsächlich da. Ich denke, wir brauchen hier mehr Augen.
rɑːdʒɑ
@snow klingt komisch, ich habe dieses Skript in meinem ~ / Musik-Ordner getestet, wo es viele Dateien mit Leerzeichen gibt und möglicherweise einige andere "ungewöhnliche" Zeichen im Pfad sind - alles in Ordnung. Wie führen Sie das Skript aus? Haben Sie Ordner- und Begrenzungsargumente angegeben? Ich habe sie nicht überprüft, um es einfach zu halten. Du sollst es so laufen lassen : ./findLargeItems.sh ~/Music 10000. Vergessen Sie nicht, darin Pfad- oder Backslash-Leerzeichen anzugeben: "/home/user/random folder"oder / home / user / random \ folder. Ich denke, Sie wissen das alles, aber nur für den Fall.
Pavel A
10
find /home/stephenm/ -maxdepth 1 -size +20k -exec du -h {} \;

Das sollte alles über 20.000 in / home / stephenm auflisten

Um in Subdirektoren zurückzukehren, lassen Sie die -maxdepth 1Option fallen.

squareborg
quelle
Ja, es ist schön und funktioniert. Darf ich bitte auch einen Weg mit du finden.
rɑːdʒɑ
@snow Ich glaube nicht, dass du es alleine schaffen kannst. Ich habe mich vielleicht geirrt. Ich habe mir nur das Handbuch angesehen.
Squareborg
@snow, siehe unten eine Lösung mit du (ich meine, wo sie zur Analyse der Größe verwendet wird), obwohl die Lösung in Stephens Antwort anscheinend eleganter ist - ich sollte sie auf jeden Fall noch man findeinmal durchlesen .
Pavel A
@snow Warte eine Minute. Wenn ich recht habe, berücksichtigen weder diese Antwort noch Terrys Kommentar die Größe der Ordner - sie sind nur für Dateien.
Pavel A.
@pavel A Ja, da ich gesehen habe, dass es für Dateien und nicht für Ordner funktioniert.
rɑːdʒɑ
1

Seien Sie vorsichtig: duDruckt nicht die Größe einer Datei, sondern gibt Ihnen eine Schätzung der Speicherplatznutzung.

Sie können eine 10-MB-Datei erstellen, die viel weniger verbraucht:

dd if=/dev/zero of=file seek=10M count=1 bs=1
stat -c %s file
ls -lh file
du -h file
cat file | wc

Ein Beispiel ist eine komprimierte Datei, die weniger Speicherplatz auf der Festplatte benötigt als ihre Größe, wie im obigen Beispiel einer Datei mit geringer Dichte .

Im obigen Beispiel find . -type f -size +5Mwird die Ausgabe fileauch dann ausgegeben , wenn sie duviel weniger als 5 MB beträgt.

Wenn Sie wissen, dass Ihre Dateinamen keine Zeilenumbrüche enthalten, können Sie die Ausgabe von filtern findmit:

find . -type f -size +5M | while IFS= read -r file; do
  du=$(du -k "$file")
  size="${du%%$(printf "\t")*}"
  if test $size -gt $((5 * 1024)); then
    echo "$file"
  fi
done

Wenn Ihre Dateinamen Zeilenumbrüche enthalten können, können Sie diese GNU-Erweiterung verwenden, aber dann etwas anderes als echoin der Schleife verwenden:

find . -type f -size +5M -print0 | while IFS= read -r -d '' file; do
  du=$(du -k "$file")
  size="${du%%$(printf "\t")*}"
  if test $size -gt $((5 * 1024)); then
    echo "$file"
  fi
done
jfg956
quelle
Guter Punkt über die tatsächlichen und scheinbaren Dateigrößen, obwohl ich bezweifle, dass TS welche hat. S / w können Sie die scheinbare Dateigröße auch mit du anzeigen. du --apparent <file>In diesem Fall ist die gemeldete Größe dieselbe wie mit ls.
Pavel A