it-swarm.com.de

anzahl der Verzeichnisse in einem bestimmten Verzeichnis zählen

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?

63
user2566898

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
71
Pavel Anossov

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

43
EmptyData
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

18
shiyani suresh

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!

11

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.

10
briceburg

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:

  1. ordner s eigener selbstreferenzieller .Eintrag und
  2. / - Ordner Link der Eltern zu Ordner
7
textral

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-Parameter do not list implied . and .. NICHT ARBEITEN wie erwartet. Wenn ich .__ benutze ls, die ./ und ../ anzeigen, so dass falsche Ergebnisse gezählt werden. LÖSUNG: /bin/ls statt ls

4
MTK

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.

2
gniourf_gniourf

Wenn Sie nur Verzeichnisse im Ordner haben und keine Dateien, geschieht dies:

ls | wc -l
1
Brainmaniac

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.

1
Anne van Rossum

Reguläre Ausdrücke verwenden.

ls -c | grep "^ d" | wc -l

0
makassi

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"
0
margenn

Am besten so:

ls -la | grep -v total | wc -l

Dies gibt Ihnen die perfekte Zählung.

0
Manoj