Si l'analyse de la sortie de ls
est dangereuse car elle peut casser certains caractères géniaux (espaces,, \n
...), quelle est la meilleure façon de connaître le nombre de fichiers dans un répertoire?
Je compte généralement sur find
pour éviter cette analyse, mais de la même manière, il find mydir | wc -l
se cassera pour les mêmes raisons.
Je travaille sur Solaris en ce moment, mais je cherche une réponse aussi portable sur différents unices et différents shells que possible.
find
vous obtiendrez le nombre de fichiers récursivement (utilisez-maxdepth 1
si vous ne le souhaitez pas.find mydir -maxdepth 1 -type f -printf \\n | wc -l
devrait gérer les caractères spéciaux dans le nom de fichier, car ils ne sont jamais imprimés en premier lieu.Réponses:
Et cette astuce?
Aussi portable que
find
etwc
.la source
n+1
fichiers sur mon système Debian). Il ne filtre pas non plus les fichiers normaux.find
commande à vos besoins spécifiques. Oui, celui-ci inclut tous les répertoires, y compris.
(ce qui pourrait être la raison pour laquelle vous voyez le résultatn+1
).find . -maxdepth 1 ! -name . -exec echo \; | wc -l
; certaines anciennes versionsfind
n'en ont pas-not
.-maxdepth
n'est pas standard (une extension GNU est désormais également prise en charge par quelques autres implémentations).Avec bash, sans utilitaires externes, ni boucles:
Dans ksh, remplacez
shopt -s dotglob
parFIGNORE=.?(.)
. Dans zsh, remplacez-le parsetopt glob_dots
ou supprimez l'shopt
appel et utilisezfiles=(*(D))
. (Ou laissez simplement tomber la ligne si vous ne voulez pas inclure de fichiers dot.) Portablement, si vous ne vous souciez pas des fichiers dot:Si vous souhaitez inclure des fichiers dot:
la source
1
pour un répertoire vide lorsquenullglob
n'est pas activé. En zsh,a=(*(DN));echo ${#a}
avec le qualificatifN
(nullglob
) n'entraîne pas d'erreur pour un répertoire vide.Devrait être assez portable pour les systèmes post-80.
Cela compte toutes les entrées du répertoire sauf
.
et..
dans le répertoire courant.Pour compter également les fichiers dans les sous-répertoires:
(que l'on devrait être portable même sous Unix V6 (1975), car il n'en a pas besoin
-prune
)la source
find dirname ! -name dirname -prune -print
). Je me suis depuis demandé s'il y avait une raison particulière d'utiliser à lagrep -c /
place dewc -l
(qui est probablement plus couramment utilisé pour le comptage).find dirname ! -name dirname
ne fonctionne pas s'il y a d'autres répertoires nommésdirname
. Il vaut mieux l'utiliserfind dirname/. ! -name .
.wc -l
compte le nombre de lignes, les noms de fichiers peuvent être constitués de plusieurs lignes car le caractère de nouvelle ligne est aussi valide que n'importe quel autre dans un nom de fichier.Essayer:
Le
-b
aura des caractères non imprimables,-A
affichera tous les fichiers sauf.
et..
et un par ligne (la valeur par défaut sur un canal, mais bon d'être explicite).Tant que nous incluons des langages de script de niveau supérieur, voici une ligne unique en Python:
Ou avec une «recherche» complète:
la source
Yoc peut utiliser une telle construction:
Mais j'ai bien peur, vous pouvez commettre une erreur comme
Argument list too long.
si vous avez trop de fichiers dans le répertoire. Cependant, je l'ai testé sur un répertoire avec 10 milliards de fichiers, et cela a bien fonctionné.la source
*
.gnu find . -maxdepth 1 -type f | wc -l
for
.Avez-vous pensé à Perl, qui devrait être relativement portable?
Quelque chose comme:
la source
Essayez ceci => Utilisation de ls avec les options -i (pour le numéro de nœud) et -F (ajoute le nom du répertoire avec '/').
la source
Avec une
perl
doublure (reformatée pour plus de lisibilité):ou
Vous pouvez utiliser des
perl
fonctions qui modifient des tableaux commegrep
oumap
avec la deuxième version. Voirperldoc -f readdir
pour un exemple d'utilisationgrep
.la source
La version la plus simple que j'utilise tout le temps et avec laquelle je n'ai jamais eu de problème est:
ls -b1 | wc -l
la source
\n
ou d'autres caractères géniaux (oui, certains unités le permettent).En plus de la
find
réponse à base proposée par Stéphane , voici une réponse conforme POSIX basée surls
:la source