J'ai un répertoire avec un grand nombre de fichiers. Je ne vois pas de commutateur ls
pour fournir le nombre de fichiers. Existe-t-il un moyen magique en ligne de commande pour obtenir le nombre de fichiers ?
En utilisant une définition large de "fichier" ;
ls | wc -l
(notez que cela ne compte pas les fichiers cachés et suppose que les noms de fichiers ne contiennent pas de caractères de nouvelle ligne).
Pour inclure les fichiers cachés (sauf .
et ..
) et éviter les problèmes avec les caractères de nouvelle ligne, la méthode canonique est la suivante :
find . ! -name . -prune -print | grep -c /
Ou récursivement :
find .//. ! -name . -print | grep -c //
Pour une définition étroite du dossier :
find . -maxdepth 1 -type f | wc -l
Si vous savez que le répertoire courant contient au moins un fichier non caché :
set -- *; echo "$#"
Ceci est évidemment généralisable à n'importe quel glob.
Dans un script, cela a l'effet secondaire parfois malheureux d'écraser les paramètres positionnels. Vous pouvez contourner cela en utilisant un sous-shell ou une fonction (version Bourne/POSIX) comme :
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
Une solution alternative est $(ls -d -- * | wc -l)
. Si le glob est *
, la commande peut être raccourcie en $(ls | wc -l)
. L'analyse de la sortie de ls
me met toujours mal à l'aise, mais ici cela devrait fonctionner tant que vos noms de fichiers ne contiennent pas de nouvelles lignes, ou que votre ls
les échappe. Et $(ls -d -- * 2>/dev/null | wc -l)
a l'avantage de gérer gracieusement le cas d'un glob non correspondant (c'est-à-dire qu'il retourne 0 dans ce cas, alors que la méthode set *
nécessite un test fastidieux pour savoir si le glob peut être vide).
Si les noms de fichiers peuvent contenir des caractères de nouvelle ligne, une alternative est d'utiliser $(ls -d ./* | grep -c /)
.
Toutes ces solutions qui reposent sur le passage de l'expansion d'un glob à ls
peuvent échouer avec une erreur argument list too long s'il y a beaucoup de fichiers correspondants.