Antworten:
Angenommen, Sie möchten nur eine rekursive Anzahl von Dateien, keine Verzeichnisse und andere Typen, dann sollte so etwas funktionieren:
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
printf "%-25.25s : " "$dir"
find "$dir" -type f | wc -l
done
find
... -print0 | xargs -0
....
bash
alias
!!
sort -rn -k 2,2 -t$':'
Sie die DESC-Liste
Diese Aufgabe faszinierte mich so sehr, dass ich selbst eine Lösung finden wollte. Es ist nicht einmal eine while - Schleife nehmen und KANN schneller in der Ausführungsgeschwindigkeit. Unnötig zu erwähnen, dass Thors Bemühungen mir sehr geholfen haben, die Dinge im Detail zu verstehen.
Also hier ist meins:
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -type f | wc -l)" file\(s\)' \;
Es sieht aus einem bestimmten Grund bescheiden aus, weil es viel mächtiger ist als es aussieht. :-)
Wenn Sie dies jedoch in Ihre .bash_aliases
Datei aufnehmen möchten, muss dies folgendermaßen aussehen:
alias somealias='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '\''echo "{} : $(find "{}" -type f | wc -l)" file\(s\)'\'' \;'
Beachten Sie die sehr schwierige Behandlung verschachtelter einfacher Anführungszeichen. Und nein, es ist nicht möglich, doppelte Anführungszeichen für das sh -c
Argument zu verwenden.
strace -fc script
. Ihre Version macht ungefähr 70% mehr Systemaufrufe. +1 für kürzeren Code :-)
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr
find . -type f | cut -d"/" -f2 | uniq -c
Listet einen Ordner und Dateien im aktuellen Ordner mit einer Anzahl von Dateien auf, die darunter gefunden werden. Schnelle und nützliche IMO. (Dateien werden mit Anzahl 1 angezeigt).
| sort -rn
, um Unterverzeichnisse nach Anzahl der Dateien zu sortieren.
Die Verwendung von find ist definitiv der richtige Weg, wenn Sie rekursiv zählen möchten, aber nur die Dateien direkt unter einem bestimmten Verzeichnis zählen möchten:
ls dir1 | wc -l
ls -d */ | xargs -n1 ls | wc -l
(Verwenden Sie die Antwort, die Sie akzeptiert haben, wenn es bereits funktioniert! Dies ist nur und jetzt wissen Sie.)
find
ist es so wichtig. (geschweige denn -print0
und xargs -0
, bereits von Scott in der anderen Antwort darauf hingewiesen)
find . -mindepth 1 -type d -print0 | xargs -0 -I{} sh -c 'printf "%4d : %s\n" "$(find {} -type f | wc -l)" "{}"'
Ich muss oft die Anzahl der Dateien in meinen Unterverzeichnissen zählen und diesen Befehl verwenden. Ich bevorzuge, dass die Zählung zuerst erscheint.
Was ich benutze ... Dadurch wird ein Array aller Unterverzeichnisse in dem von Ihnen als Parameter angegebenen erstellt. Drucken Sie das Unterverzeichnis und die Anzahl desselben Unterverzeichnisses, bis alle Unterverzeichnisse verarbeitet sind.
#!/bin/bash
directories=($(/bin/ls -l $1 | /bin/grep "^d" | /usr/bin/awk -F" " '{print $9}'))
for item in ${directories[*]}
do
if [ -d "$1$item" ]; then
echo "$1$item"
/bin/ls $1$item | /usr/bin/wc -l
fi
done
Sie könnten diesen Python-Code verwenden. Starten Sie den Interpreter, indem Sie Folgendes python3
ausführen und einfügen:
folder_path = '.'
import os, glob
for folder in sorted(glob.glob('{}/*'.format(folder_path))):
print('{:}: {:>8,}'.format(os.path.split(folder)[-1], len(glob.glob('{}/*'.format(folder)))))
Oder eine rekursive Version für verschachtelte Zählungen:
import os, glob
def nested_count(folder_path, level=0):
for folder in sorted(glob.glob('{}/'.format(os.path.join(folder_path, '*')))):
print('{:}{:}: {:,}'.format(' '*level, os.path.split(os.path.split(folder)[-2])[-1], len(glob.glob(os.path.join(folder, '*')))))
nested_count(folder, level+1)
nested_count('.')
Beispielausgabe:
>>> figures: 5
>>> misc: 1
>>> notebooks: 5
>>> archive: 65
>>> html: 12
>>> py: 12
>>> src: 14
>>> reports: 1
>>> content: 6
>>> src: 1
>>> html_download: 1