web-dev-qa-db-fra.com

compter le nombre de répertoires dans un répertoire spécifique

Comment compter le nombre de dossiers dans un répertoire spécifique. J'utilise la commande suivante, mais elle en fournit toujours une supplémentaire. 

find /directory/ -maxdepth 1 -type d -print| wc -l

Par exemple, si j'ai 3 dossiers, cette commande fournit 4. Si elle contient 5 dossiers, la commande fournit 6. Pourquoi?

63
user2566898

find imprime également le répertoire lui-même:

$ 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

Vous pouvez plutôt tester les enfants du répertoire et ne pas y descendre du tout:

$ 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

Vous pouvez également utiliser ls:

$ 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

Obtenir un nombre de répertoires uniquement dans le répertoire en cours

echo */ | wc

vous sortirez mis comme 1 309 4594 

2nd digit représente non. des annuaires.

ou 

tree -L 1 | tail -1

43
EmptyData
find . -mindepth 1 -maxdepth 1 -type d | wc -l

For find -mindepth signifie le nombre total récursif dans les répertoires

-maxdepth signifie le nombre total récursif dans les répertoires

-type d signifie répertoire

Et pour wc -l signifie compter les lignes de l'entrée

18
shiyani suresh

Le meilleur moyen de naviguer sur votre lecteur et d’exécuter simplement

ls -lR | grep ^d | wc -l

et Trouver tous les dossiers au total, y compris les sous-répertoires?

find /mount/point -type d | wc -l

... ou trouver tous les dossiers dans le répertoire racine (sans compter les sous-répertoires)?

find /mount/point -maxdepth 1 -type d | wc -l

À votre santé!

11
Manish Shrivastava

Je pense que le plus facile est

  ls -ld images/* | wc -l

images est votre répertoire cible. Le drapeau -d limite les répertoires et le drapeau -l effectue une liste par ligne, compatible avec le très connu wc -l pour le nombre de lignes.

10
briceburg

Exécutez stat -c %h folder et soustrayez 2 du résultat. Cela n'utilise qu'un seul sous-processus par opposition aux 2 (voire 3) requis par la plupart des autres solutions ici (généralement find plus wc).

En utilisant sh/bash:

cnt = $ ((`stat -c% h folder` - 2))
echo $ cnt # 'echo' est un processus intégré sh/bash, pas un processus supplémentaire

Utilisation de csh/tcsh:

@ cnt = `stat -c% h folder` - 2
echo $ cnt # 'echo' est un processus intégré csh/tcsh, pas un processus supplémentaire


Explication: stat -c %h folder imprime le nombre de liens physiques vers dossier, et chaque sous-dossier situé sous dossier contient une entrée ../ qui est un lien permanent vers dossier . Vous devez soustraire 2 car il y a deux liens durs supplémentaires dans le décompte:

  1. dossier propre entrée ./ de soi-même, et
  2. lien du parent de dossier _ vers {dossier} _
7
textral

Quelques exemples utiles:

compter les fichiers dans le répertoire courant

/bin/ls -lA  | egrep -c '^-'

compte dirs dans le répertoire courant

/bin/ls -lA  | egrep -c '^d'

compter les fichiers et les répertoires dans le répertoire en cours

/bin/ls -lA  | egrep -c '^-|^d'

compter les fichiers et les répertoires dans un sous-répertoire

/bin/ls -lA  subdir_name/ | egrep -c '^-|^d'

J'ai remarqué une chose étrange (du moins dans mon cas):

Quand j'ai essayé avec ls à la place de /bin/ls le paramètre -Ado not list implied . and .. NE FONCTIONNE pas comme prévu. Quand j'utilise ls qui montrent ./ et ../ Donc, le résultat est faux. SOLUTION: /bin/ls à la place ls

4
MTK

Une solution pure bash:

shopt -s nullglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} (non-hidden) directories"

Si vous souhaitez également compter les répertoires cachés:

shopt -s nullglob dotglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} directories (including hidden ones)"

Notez que cela comptera également les liens vers les répertoires. Si vous ne voulez pas cela, c'est un peu plus difficile avec cette méthode.


Utiliser find:

find /path/to/directory -type d \! -name . -Prune -exec printf x \; | wc -c

L'astuce consiste à générer une x sur stdout à chaque fois qu'un répertoire est trouvé, puis à utiliser wc pour compter le nombre de caractères. Ceci comptera le nombre de tous les répertoires (y compris ceux cachés), excluant les liens.


Les méthodes présentées ici sont toutes sans danger pour les personnages amusants pouvant apparaître dans les noms de fichiers (espaces, nouvelles lignes, caractères globaux, etc.).

2
gniourf_gniourf

Si vous avez seulement des répertoires dans le dossier et aucun fichier, ceci le fait

ls | wc -l
1
Brainmaniac

Utiliser zsh:

a=(*(/N)); echo ${#a}

N est un nullglob, / le fait correspondre aux répertoires, # compte. Il traitera parfaitement les espaces dans les noms de répertoires et renverra 0 s'il n'y a pas de répertoires.

1
Anne van Rossum

Utiliser des expressions régulières.

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

0
makassi

Compter tous les fichiers et sous-dossiers, style Windows:

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

Meilleure façon de le faire:

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

Cela vous donne le compte parfait.

0
Manoj