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?
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
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
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
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é!
Je pense que le plus facile est
ls -ld images/* | wc -l
où 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.
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:
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-A
do not list implied . and ..
NE FONCTIONNE pas comme prévu. Quand j'utilisels
qui montrent ./ et ../ Donc, le résultat est faux. SOLUTION:/bin/ls
à la placels
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.).
Si vous avez seulement des répertoires dans le dossier et aucun fichier, ceci le fait
ls | wc -l
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.
Utiliser des expressions régulières.
ls -c | grep "^ d" | wc -l
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"
Meilleure façon de le faire:
ls -la | grep -v total | wc -l
Cela vous donne le compte parfait.