it-swarm.com.de

Rekursiv die größte Datei finden

Ich versuche rekursiv, die größte Datei in einem Verzeichnis zu finden. Wenn sich in diesem Verzeichnis ein Unterverzeichnis befindet, muss die Funktion in dieses Verzeichnis gehen und prüfen, ob die größte Datei vorhanden ist. Sobald die größte Datei gefunden wurde, wird die Ausgabe mit dem relativen Pfadnamen sowie dem Namen und der Größe der größten Datei angezeigt.

EX:

[email protected] (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

Das habe ich:

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS

Ich stecke jetzt schon eine Weile fest. Ich kann dies nicht durch Pipelining einer Reihe vorhandener Unix-Tools implementieren. Irgendwelche Ideen wären nett!

41
user2419571

verwenden Sie find (hier unter der Annahme GNU find), um Dateinamen mit der Dateigröße auszugeben. sortieren Sie den größten aus.

find . -type f -printf "%s\t%p\n" | sort -n | tail -1

Dies setzt voraus, dass Dateipfade keine Zeilenumbrüche enthalten.


Verwenden einer Schleife in bash mit der GNU Implementierung von stat:

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"

Dies ist erheblich langsamer als die Suchlösung. Dies setzt auch voraus, dass Dateinamen nicht mit Zeilenumbrüchen enden und versteckte Dateien überspringen und nicht in versteckte Verzeichnisse absteigen.

Wenn sich im aktuellen Verzeichnis eine Datei mit dem Namen - Befindet, wird die Größe der auf stdin geöffneten Datei berücksichtigt.

Beachten Sie, dass Versionen von bash vor 4.3 beim Absteigen des Verzeichnisbaums symbolischen Links folgten.

57
glenn jackman

Dieser Befehl hilft auch dabei, die definierte Größe aufzulisten.

find . -type f -size +100M -exec ls -lh {} \;
9

Dies funktioniert unter BSD/macOS:

find . -type f -ls | sort -k7 -r

Sie können auch | head -n 3, um die Anzahl der interessanten Einträge anzuzeigen (in diesem Fall 3).

5
CeDeROM

Mit zsh für die größte reguläre Datei:

ls -ld -- **/*(.DOL[1])

(Natürlich können Sie ls -ld -- durch einen beliebigen Befehl ersetzen. Wenn Sie GNU ls oder kompatibel verwenden, lesen Sie auch die Option -h für lesbare Größen)

  • .: Nur reguläre Dateien (keine Verzeichnisse, Symlinks, Geräte, Fifos ...)
  • D: Versteckte einschließen und in versteckte Verzeichnisse absteigen
  • OL: Umgekehrt nach Größe (Length).
  • [1]: Nur die erste Übereinstimmung.

Wenn es Krawatten gibt, erhalten Sie eine davon nach dem Zufallsprinzip. Wenn Sie die erste in alphabetischer Reihenfolge wünschen, fügen Sie ein zusätzliches on (order by name) hinzu, um die Bindungen alphabetisch zu sortieren.

Beachten Sie, dass die Dateigröße und nicht die Festplattennutzung berücksichtigt werden.

4