Auflisten von Dateien in einem Verzeichnis einschließlich des Inhalts von Unterordnern mit Sortierung

9

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, so weit wie möglich aufzulisten und zu sortieren, während ich noch rekursiv bin ls -lhSR(das hist schön zu haben, aber definitiv nicht wesentlich für mich, solange ich Dateigrößen erhalten kann). Ich übersehen wahrscheinlich etwas Offensichtliches oder frage nach dem Unmöglichen, aber jeder Rat hier wäre sehr dankbar.

Toms
quelle

Antworten:

15

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)
pLumo
quelle
Oh perfekt! Vielen Dank, das hat genau das getan, was ich brauchte!
Toms
3
Ich bin froh, dass meine Antwort Ihnen geholfen hat. Bitte klicken Sie auf das Häkchen auf der linken Seite, um die akzeptierte Antwort zu markieren. Vielen Dank.
pLumo
1
@RoVo Es wäre auch schön, die Frage zu bewerten, da Sie sie, da Sie sie beantwortet haben, wahrscheinlich interessant und nützlich fanden.
Terdon
Das ist in der Tat wahr und ich habe das jetzt
getan ;-)
@toms Es ist in Ordnung, eine Weile zu warten (vielleicht einen Tag oder so), um die Antwort zu akzeptieren, selbst wenn sie so gut ist wie diese. Sobald die Antwort akzeptiert wurde, kann sich keine andere Antwort als noch besser herausstellen. Und aus diesem Grund werden sich viele Leute nicht die Mühe machen, andere Antworten einzureichen, sodass wir keine Chance haben, sie zu sehen, um herauszufinden, ob es ihnen besser geht.
Monty Harder
7

Da Sie keine bestimmte Shell angegeben haben, finden Sie hier eine Alternative, bei der die Glob-Qualifikationsmerkmale von zsh mit verwendet werden

setopt extendedglob

für die Rekursion. Dann zum Beispiel:

  1. rekursiv einfache Dateien auflisten:

    printf '%s\n' **/*(.)
  2. rekursiv auflisten einfache Dateien, o rdered durch in Falten L ength (dh Größe):

    printf '%s\n' **/*(.oL)
  3. rekursiv Liste einfache Dateien, O rdered durch de Knitter Größe:

    printf '%s\n' **/*(.OL)
  4. Listen Sie rekursiv einfache Dateien auf, sortiert nach abnehmender Größe, und wählen Sie die drei besten Ergebnisse aus:

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

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

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

Mit der globstarShell-Option 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 dies mit zu vielen Dateien versuchen, wird der Fehler "Argumentliste zu lang" angezeigt. Um Arbeit um das, können Sie verwenden , printfund xargs:

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

Ich habe gerade festgestellt, dass dies auch die Verzeichnisse (mit einer Größe von 4096 Bytes) druckt - wenn Sie das nicht wollen, 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

Beispiellauf

$ 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
Dessert
quelle
Schöne Lösung. Im Vergleich zu find enthält es keine versteckten Dateien. Wie kann man das erreichen?
pLumo
@RoVo Vergiss diese immer - du musst nur die dotglobShell-Option einstellen , siehe meine aktualisierte Antwort.
Nachtisch
Anstatt Verzeichnisse printf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
nachträglich
Sie können verwenden, ls -lhSd **/*wenn es Ihnen nichts ausmacht, die Verzeichnisse als Teil der Liste zu haben. Oder wenn keiner Ihrer Verzeichnisnamen .und alle gewünschten Dateien enthalten sind , können Sie ll -hS **/*.*oder ähnliches.
Peter Cordes
verwandelte das in eine Antwort
Peter Cordes
3

Wenn Sie kein zsh haben, können Sie immer noch du+ verwenden sort:

  1. Vom Menschen lesbare Größen, einschließlich der kumulierten Größen von Verzeichnissen:

    du --apparent-size -ah0 . | sort -zh | xargs -0L1
    
  2. Nur Dateien (mit find):

    find . -type f -print0 |
      du --files0-from=- --apparent-size -ah0 |
      sort -zh |
      xargs -0L1
    

In beiden Fällen habe ich Gebrauch nullterminierte Linien entschieden ( -0, -z, -print0Optionen), sicher gegen alle gültigen Dateinamen zu sein.

muru
quelle
0

Für eine schnelle interaktive Verwendung in Verzeichnisbäumen, die nicht zu groß sind, shopt -s globstarist das wirklich nett. Ein Glob kann keine Verzeichnisse herauszufiltern auf Typ basiert, aber wenn Sie es verwenden , um mit ls -ddann lswird nur die Verzeichnisnamen drucken, statt die Inhalte.

Angenommen, Ihr llAlias ​​umfasst -lh:

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

Sie erhalten eine Ausgabe wie diese (aus meinem Code-Golf-Verzeichnis), jedoch mit farblicher Hervorhebung (damit die Verzeichnisse leichter zu sehen 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 durch Durchleiten herausfiltern grep -v '^d'

Sie können manchmal einen Glob verwenden, der nur mit Dateien und nicht mit Verzeichnissen übereinstimmt, wenn Ihre Dateinamen ein Muster haben. zB ll -rSd **/*.jpgoder **/*.*funktioniert sogar, wenn keiner Ihrer Verzeichnisnamen .und alle gewünschten Dateien enthalten sind .

(Für Leute mit DOS-Hintergrund: Unter *.*Unix ist nichts Magisches . Es stimmt nur mit jedem Verzeichniseintrag überein, der einen Literalpunkt enthält. Abgesehen von ausführbaren Dateien und manchmal Textdateien ist es jedoch üblich, Dateinamen mit Erweiterungen zu versehen.)

@dessert weist darauf hin, dass Sie es benötigen würden shopt -s dotglob, um mit allen Dateien übereinzustimmen .


Mit GNU find

Wenn nicht zu viele Dateien in eine lsBefehlszeile passen , find -exec ls {} +werden sie alle in der Befehlszeile abgelegt, wo lssie sortiert werden können.

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

Durch Verwenden von -not -type danstatt zu -type fvermeiden, dass Symlinks, Named Pipes, Sockets, Gerätedateien und alles, was Sie sonst noch in Ihren Verzeichnissen herumtrampeln, ignoriert werden.


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 in der Liste sortiert, um die Summe aller Inhalte zu erhalten, aber einzelne Dateien sind weiterhin enthalten.

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

Ich benutze oft du -sch * | sort -hoder */nur Verzeichnisse zu bekommen.

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

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

Peter Cordes
quelle