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 h
ist 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:
Einfache Dateien rekursiv auflisten:
printf '%s\n' **/*(.)
einfache Dateien rekursiv auflisten,Öbestellt vonInFaltenbildungMLänge (also Größe):
printf '%s\n' **/*(.oL)
einfache Dateien rekursiv auflisten,Öbestellt vondeRillengröße:
printf '%s\n' **/*(.OL)
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 globstar
Shell-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 printf
und 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 globstar
ist wirklich nett. Ein Glob kann Verzeichnisse nicht nach Typ herausfiltern, aber wenn Sie ihn verwenden, ls -d
wird ls
nur der Verzeichnisname statt des Inhalts gedruckt.
Angenommen, Ihr ll
Alias 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 dotglob
dass es passen mussalleDateien.
Mit GNUfind
Wenn die Anzahl der Dateien nicht zu groß ist, um sie in eine ls
Befehlszeile zu passen, find -exec ls {} +
werden sie alle in die Befehlszeile gestellt, wo ls
sie sortiert werden können.
find -not -type d -exec ls --color -lrSh {} +
Durch die Verwendung -not -type d
von anstelle von -type f
wird 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 -h
Drucke. Es ist perfekt für die Verwendung mit geeignet du
.
Ich verwende häufig du -sch * | sort -h
oder, */
um nur Verzeichnisse abzurufen.
du -sch **/* | sort -h
würde Ihnen die obige Ausgabe geben, wenn Sie vergessen, dass es du
eine -a
Option 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 **/*
.