Wie zählt man die Anzahl der Ordner in einem bestimmten Verzeichnis? Ich verwende den folgenden Befehl, der jedoch immer einen zusätzlichen Befehl enthält.
find /directory/ -maxdepth 1 -type d -print| wc -l
Wenn ich beispielsweise 3 Ordner habe, enthält dieser Befehl 4. Wenn er 5 Ordner enthält, enthält der Befehl 6. Warum?
find
druckt auch das Verzeichnis selbst:
$ find .vim/ -maxdepth 1 -type d
.vim/
.vim/indent
.vim/colors
.vim/doc
.vim/after
.vim/autoload
.vim/compiler
.vim/plugin
.vim/syntax
.vim/ftplugin
.vim/bundle
.vim/ftdetect
Sie können stattdessen die untergeordneten Elemente des Verzeichnisses testen und nicht in sie hineinsteigen:
$ find .vim/* -maxdepth 0 -type d
.vim/after
.vim/autoload
.vim/bundle
.vim/colors
.vim/compiler
.vim/doc
.vim/ftdetect
.vim/ftplugin
.vim/indent
.vim/plugin
.vim/syntax
$ find .vim/* -maxdepth 0 -type d | wc -l
11
$ find .vim/ -maxdepth 1 -type d | wc -l
12
Sie können auch ls
verwenden:
$ ls -l .vim | grep -c ^d
11
$ ls -l .vim
total 52
drwxrwxr-x 3 anossovp anossovp 4096 Aug 29 2012 after
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29 2012 bundle
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 colors
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 compiler
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 doc
-rw-rw-r-- 1 anossovp anossovp 48 Aug 29 2012 filetype.vim
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 ftdetect
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 ftplugin
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 indent
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 plugin
-rw-rw-r-- 1 anossovp anossovp 2505 Aug 29 2012 README.rst
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 syntax
$ ls -l .vim | grep ^d
drwxrwxr-x 3 anossovp anossovp 4096 Aug 29 2012 after
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29 2012 bundle
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 colors
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 compiler
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 doc
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 ftdetect
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 ftplugin
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 indent
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 plugin
drwxrwxr-x 2 anossovp anossovp 4096 Aug 29 2012 syntax
Ermitteln Sie nur die Verzeichnisse im aktuellen Verzeichnis
echo */ | wc
du wirst rauskommen wie 1 309 4594
2nd digit
steht für nein. von Verzeichnissen.
oder
tree -L 1 | tail -1
find . -mindepth 1 -maxdepth 1 -type d | wc -l
Für find -mindepth
bedeutet die rekursive Gesamtzahl in Verzeichnissen
-maxdepth
steht für die rekursive Gesamtzahl in Verzeichnissen
-type d
bedeutet Verzeichnis
Und für wc -l
bedeutet das Zählen der Zeilen der Eingabe
Am besten navigieren Sie zu Ihrem Laufwerk und führen es einfach aus
ls -lR | grep ^d | wc -l
und alle Ordner insgesamt finden, einschließlich der Unterverzeichnisse?
find /mount/point -type d | wc -l
... oder finden Sie alle Ordner im Stammverzeichnis (ohne Unterverzeichnisse)?
find /mount/point -maxdepth 1 -type d | wc -l
Prost!
Ich denke, das ist am einfachsten
ls -ld images/* | wc -l
dabei ist images
Ihr Zielverzeichnis. Das Flag -d begrenzt die Anzahl der Verzeichnisse, und das Flag -l führt eine Liste pro Zeile aus, die mit dem bekannten wc -l
für die Zeilenanzahl kompatibel ist.
Führen Sie stat -c %h folder
aus und ziehen Sie 2 vom Ergebnis ab. Dies erfordert nur einen einzigen Teilprozess, im Gegensatz zu den 2 (oder sogar 3), die von den meisten anderen Lösungen (normalerweise find
plus wc
) benötigt werden.
Sh/bash verwenden:
cnt = $ ((`stat -c% h folder` - 2))
echo $ cnt # 'echo' ist ein eingebauter sh/bash, kein zusätzlicher Prozess
Csh/tcsh verwenden:
@ cnt = `stat -c% h ordner` - 2
echo $ cnt # 'echo' ist ein csh/tcsh-Builtin, kein zusätzlicher Prozess
Erläuterung: stat -c %h folder
gibt die Anzahl der Hardlinks an ordner aus, und jeder Unterordner unter ordner enthält einen ..Eintrag, bei dem es sich um einen Hardlink handelt. Zurück zum/- Ordner . Sie müssen 2 subtrahieren, da die Zählung zwei zusätzliche Hardlinks enthält:
Einige nützliche Beispiele:
anzahl der Dateien im aktuellen Verzeichnis
/bin/ls -lA | egrep -c '^-'
anzahl der Verzeichnisse im aktuellen Verzeichnis
/bin/ls -lA | egrep -c '^d'
zählen Dateien und Verzeichnisse im aktuellen Verzeichnis
/bin/ls -lA | egrep -c '^-|^d'
zählen Dateien und Verzeichnisse in einem Unterverzeichnis
/bin/ls -lA subdir_name/ | egrep -c '^-|^d'
Ich habe etwas Merkwürdiges (zumindest in meinem Fall) bemerkt:
Wenn ich stattdessen mit
ls
versucht habe,/bin/ls
der-A
-Parameterdo not list implied . and ..
NICHT ARBEITEN wie erwartet. Wenn ich .__ benutzels
, die ./ und ../ anzeigen, so dass falsche Ergebnisse gezählt werden. LÖSUNG:/bin/ls
stattls
Eine reine Bash-Lösung:
shopt -s nullglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} (non-hidden) directories"
Wenn Sie auch die versteckten Verzeichnisse zählen möchten:
shopt -s nullglob dotglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} directories (including hidden ones)"
Beachten Sie, dass dadurch auch Links zu Verzeichnissen gezählt werden. Wenn Sie das nicht wollen, ist es mit dieser Methode etwas schwieriger.
find
verwenden:
find /path/to/directory -type d \! -name . -Prune -exec printf x \; | wc -c
Der Trick besteht darin, jedes Mal, wenn ein Verzeichnis gefunden wird, eine Variable x
in stdout auszugeben und dann die Variable wc
zu verwenden, um die Anzahl der Zeichen zu zählen. Dadurch wird die Anzahl aller Verzeichnisse (einschließlich versteckter Verzeichnisse) ohne Links gezählt.
Die hier vorgestellten Methoden beziehen sich alle auf sichere Zeichen, die in Dateinamen (Leerzeichen, Zeilenumbrüche, Glob-Zeichen usw.) vorkommen können.
Wenn Sie nur Verzeichnisse im Ordner haben und keine Dateien, geschieht dies:
ls | wc -l
zsh
verwenden:
a=(*(/N)); echo ${#a}
Die Variable N
ist ein Nullglob. /
stimmt mit den Verzeichnissen überein, #
zählt. Leerzeichen in Verzeichnisnamen werden säuberlich verarbeitet und 0
zurückgegeben, wenn keine Verzeichnisse vorhanden sind.
Reguläre Ausdrücke verwenden.
ls -c | grep "^ d" | wc -l
Zählen Sie alle Dateien und Unterordner im Windows-Stil:
dir=/YOUR/PATH;f=$(find $dir -type f | wc -l); d=$(find $dir -mindepth 1 -type d | wc -l); echo "$f Files, $d Folders"
Am besten so:
ls -la | grep -v total | wc -l
Dies gibt Ihnen die perfekte Zählung.