Ich habe diese Frage afte gefunden Ich hatte bereits mein eigenes ähnliches Skript herausgefunden. Es scheint zu Ihren Bedingungen zu passen und ist sehr flexibel, also dachte ich, dass ich es als Antwort hinzufügen würde.
Vorteile:
- können jede Tiefe (0 für
.
, 1 für die erste Ebene Verzeichnisse gruppiert werden, usw.)
- druckt ziemlich Ausgabe
- keine Schleife, und nur ein
find
Befehl, so dass es ein bisschen schneller auf großen Verzeichnissen ist
- noch abgestimmt werden können benutzerdefinierte Filter (maxdepth, um es nicht-rekursive, Dateinamensmuster hinzufügen
)
Raw Code:
find -P . -type f | rev | cut -d/ -f2- | rev | \
cut -d/ -f1-2 | cut -d/ -f2- | sort | uniq -c
in eine Funktion eingewickelt und erklärt:
fc() {
# Usage: fc [depth >= 0, default 1]
# 1. List all files, not following symlinks.
# (Add filters like -maxdepth 1 or -iname='*.jpg' here.)
# 2. Cut off filenames in bulk. Reverse and chop to the
# first/(remove filename). Reverse back.
# 3. Cut everything after the specified depth, so that each line
# contains only the relevant directory path
# 4. Cut off the preceeding '.' unless that's all there is.
# 5. Sort and group to unique lines with count.
find -P . -type f \
| rev | cut -d/ -f2- | rev \
| cut -d/ -f1-$((${1:-1}+1)) \
| cut -d/ -f2- \
| sort | uniq -c
}
Erzeugt eine Ausgabe wie folgt aus:
$ fc 0
1668 .
$ fC# depth of 1 is default
6 .
3 .ssh
11 Desktop
44 Downloads
1054 Music
550 Pictures
Natürlich mit der Nummer ersten kann es zu sort
geleitet werden:
$ fc | sort
3 .ssh
6 .
11 Desktop
44 Downloads
550 Pictures
1054 Music
Um die Person, die enge Abstimmung: bash ist eine tatsächliche Sprache . – Bernard