Auflisten von Dateien in einem Verzeichnis einschließlich der Inhalte von Unterordnern mit Sortierung

Auflisten von Dateien in einem Verzeichnis einschließlich der Inhalte von Unterordnern mit Sortierung

Ich möchte den gesamten Inhalt eines Verzeichnisses auflisten, einschließlich des Inhalts von Unterordnern, aber sortiert nach Dateigröße. Bisher habe ich es geschafft, aufzulisten und zu sortieren, während ich immer noch rekursiv bin ls -lhSR(das hist nett zu haben, aber definitiv nicht unbedingt erforderlich für mich, solange ich die Dateigrößen ermitteln kann). Ich übersehe wahrscheinlich etwas Offensichtliches oder verlange Unmögliches, aber jeder Ratschlag hier wäre sehr willkommen.

Antwort1

Sie können find verwenden:

find . -type f -printf "%s %P\n" | sort -n

Optional: Um Bytewerte in ein für Menschen lesbares Format zu konvertieren, fügen Sie Folgendes hinzu:

| numfmt --to=iec-i --field=1

Erläuterung:

 find in current directory (.) all files (-type f) 

 -printf: suppress normal output and print the following:
     %s - size in bytes
     %P - path to file
     \n - new line

 | sort -n: sort the result (-n = numeric)

Antwort2

Da Sie keine bestimmte Shell angegeben haben, finden Sie hier eine Alternative unter Verwendung der Glob-Qualifizierer von zsh mit

setopt extendedglob

für die Rekursion. Dann zum Beispiel:

  1. Einfache Dateien rekursiv auflisten:

    printf '%s\n' **/*(.)
    
  2. einfache Dateien rekursiv auflisten,Öbestellt vonInFaltenbildungMLänge (also Größe):

    printf '%s\n' **/*(.oL)
    
  3. einfache Dateien rekursiv auflisten,Öbestellt vondeRillengröße:

    printf '%s\n' **/*(.OL)
    
  4. Einfache Dateien rekursiv auflisten, sortiert nach absteigender Größe, und die ersten drei Ergebnisse auswählen:

    printf '%s\n' **/*(.OL[1,3])
    

Wenn Sie auch die Dateigrößen wissen möchten, können Sie

du -hb **/*(.OL[1,3])

Antwort3

Mit der globstarShell-Option „Set“ können Sie Shell-Globbing verwenden:

shopt -s globstar         # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n

Wenn Sie das mit zu vielen Dateien versuchen, erhalten Sie die Fehlermeldung „Argumentliste zu lang“. Um das zu umgehen, können Sie printfund verwenden xargs:

printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n

Mir ist gerade aufgefallen, dass hierdurch auch die Verzeichnisse (mit einer Größe von 4096 Bytes) ausgedruckt werden. Wenn Sie dies nicht möchten, verwenden Sie stattdessen Folgendes:

stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n

Beispielausführung

$ tree
.
├── edits.png
├── makescript
├── new
│   └── edits.png
└── test
    └── 1.png

2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png

Antwort4

Für den schnellen interaktiven Einsatzauf Verzeichnisbäumen, die nicht zu groß sind,shopt -s globstarist wirklich nett. Ein Glob kann Verzeichnisse nicht nach Typ herausfiltern, aber wenn Sie ihn verwenden, ls -dwird lsnur der Verzeichnisname statt des Inhalts gedruckt.

Angenommen, Ihr llAlias ​​enthält -lh:

  # with  shopt -s globstar   in your .bashrc
ll -rSd **/*

gibt Ihnen eine Ausgabe wie diese (aus meinem Code-Golf-Verzeichnis), allerdings mit farblicher Hervorhebung (damit die Verzeichnisse leichter zu erkennen sind). Beachten Sie, dass die Sortierung nach Dateigröße über Unterverzeichnisse hinweg erfolgte.

drwxr-xr-x 1 peter peter   70 Jun  8 07:56 casexchg
...
drwxr-xr-x 1 peter peter  342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter  387 Jul 29  2017 likely.cpp
-rw-r--r-- 1 peter peter  416 Aug 31  2017 true-binary.asm~
-rw-r--r-- 1 peter peter  447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun  1  2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31  2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17  2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24  2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25  2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26  2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb  6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25  2017 fibonacci/fibonacci-1G-performance.asm~
...

Sie können die Verzeichnisse herausfiltern, indem Sie sie durchleitengrep -v '^d'

Sie können manchmal einen Glob verwenden, der nur Dateien und keine Verzeichnisse abgleicht, wenn Ihre Dateinamen ein Muster haben. z. B. ll -rSd **/*.jpg, oder **/*.*funktioniert sogar, wenn keiner Ihrer Verzeichnisnamen enthält .und alle gewünschten DateienTun.

(Für Leute mit DOS-Hintergrund: *.*Unter Unix gibt es nichts Magisches. Es gleicht einfach jeden Verzeichniseintrag ab, der einen Punkt enthält. Aber außer bei ausführbaren Dateien und manchmal Textdateien ist es üblich, Dateinamen Erweiterungen zu geben.)

@dessert weist darauf hin, shopt -s dotglobdass es passen mussalleDateien.


Mit GNUfind

Wenn die Anzahl der Dateien nicht zu groß ist, um sie in eine lsBefehlszeile zu passen, find -exec ls {} +werden sie alle in die Befehlszeile gestellt, wo lssie sortiert werden können.

find -not -type d -exec ls --color -lrSh {} +

Durch die Verwendung -not -type dvon anstelle von -type fwird das Ignorieren von symbolischen Links, benannten Pipes, Sockets, Gerätedateien und allem, was sonst noch in Ihren Verzeichnissen herumliegt, vermieden.


Mit du:

du -ach | sort -h
....
4.0K    x86-modedetect-polyglot.o
8.0K    ascii-compress-base.asm
8.0K    dizzy-integer
8.0K    stopwatch-rdtsc.asm
8.0K    string-exponential.asm
8.0K    true-binary
12K     a.out
12K     bubblesort.asm
12K     casexchg
12K     empty-args
100K    parity-party
220K    fibonacci
628K    total

Jetzt werden Verzeichnisnamen mit der Gesamtsumme ihres gesamten Inhalts in die Liste einsortiert, einzelne Dateien bleiben aber weiterhin enthalten.

sort -h, auch bekannt als --human-numeric-sort, sortiert Zahlen mit Größensuffixen wie du -hDrucke. Es ist perfekt für die Verwendung mit geeignet du.

Ich verwende häufig du -sch * | sort -hoder, */um nur Verzeichnisse abzurufen.

du -sch **/* | sort -hwürde Ihnen die obige Ausgabe geben, wenn Sie vergessen, dass es dueine -aOption gibt.

(Ich habe mir nur die Zeit genommen, es nachzuschlagen, weil ich eine Antwort poste. Für die interaktive Verwendung hätte ich wahrscheinlich einfach verwendet du -sch **/*.

verwandte Informationen