J'ai un répertoire avec un grand nombre de fichiers. Je ne vois pas de commutateur ls
pour fournir le nombre. Existe-t-il une magie en ligne de commande pour obtenir le nombre de fichiers?
Utilisation d'une définition large de "fichier"
ls | wc -l
(notez qu'il 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 des fichiers masqués (sauf .
et ..
) et éviter les problèmes avec les caractères de nouvelle ligne, la manière canonique est:
find . ! -name . -Prune -print | grep -c /
Ou récursivement:
find .//. ! -name . -print | grep -c //
Pour une définition étroite du fichier:
find . -maxdepth 1 -type f | wc -l
ls -1 | wc -l
...
$ ls --help | grep -- ' -1'
-1 list one file per line
...
$ wc --help | grep -- ' -l'
-l, --lines print the newline counts
PS: Remarque ls - <numéro un> | wc - <letter-l>
J'ai trouvé du --inodes
utile, mais je ne sais pas de quelle version de du
il a besoin. Il devrait être sensiblement plus rapide que les approches alternatives utilisant find
et wc
.
Sur Ubuntu 17.10, les travaux suivants:
du --inodes # all files and subdirectories
du --inodes -s # summary
du --inodes -d 2 # depth 2 at most
Combiner avec | sort -nr
pour trier par ordre décroissant du nombre d'inodes contenus.
La réponse probablement la plus complète en utilisant la paire ls
/wc
est
ls -Aq | wc -l
si vous voulez compter les fichiers de points, et
ls -q | wc -l
autrement.
-A
consiste à compter les fichiers de points, mais omettre .
et ..
.-q
make ls
remplacez les caractères non graphiques, en particulier les caractères de nouvelle ligne, par ?
, créant une ligne de sortie pour chaque fichierPour obtenir une sortie d'une ligne à partir de ls
dans le terminal (c'est-à-dire sans la canaliser dans wc
), -1
l'option doit être ajoutée.
(comportement de ls
testé avec coreutils 8.23)
Si vous savez que le répertoire actuel contient au moins un fichier non masqué:
set -- *; echo "$#"
Ceci est évidemment généralisable à n'importe quel globe.
Dans un script, cela a pour effet secondaire parfois malheureux d'écraser les paramètres de position. Vous pouvez contourner cela en utilisant un sous-shell ou avec 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
leur échappe. Et $(ls -d -- * 2>/dev/null | wc -l)
a l'avantage de traiter avec élégance le cas d'un glob qui ne correspond pas (c'est-à-dire qu'il renvoie 0 dans ce cas, alors que la méthode set *
Nécessite de tester délicatement si le glob peut être vide ).
Si les noms de fichiers peuvent contenir des caractères de nouvelle ligne, une alternative consiste à utiliser $(ls -d ./* | grep -c /)
.
L'une de ces solutions qui repose sur le passage de l'expansion d'un glob à ls
peut échouer avec une erreur liste d'arguments trop longue s'il y a beaucoup de fichiers correspondants.
En utilisant la paire ls/wc si nous ajoutons -U, ce sera beaucoup plus rapide (ne pas trier).
ls -AqU | wc -l
Après avoir installé la commande tree, tapez simplement:
tree
Si vous voulez aussi des fichiers cachés:
tree -a
Si vous utilisez Debian/Mint/Ubuntu Linux, tapez la commande suivante pour installer la commande d'arborescence:
Sudo apt-get install tree
L'option -L est utilisée pour spécifier le niveau d'affichage maximal de l'arborescence de répertoires. La commande tree ne compte pas seulement le nombre de fichiers, mais aussi le nombre de répertoires, en considérant autant de niveaux de l'arborescence que vous le souhaitez.
find -maxdepth 1 -type f -printf . | wc -c
-maxdepth 1
le rendra non récursif, find
est récursif par défaut-type f
inclura uniquement les fichiers-printf .
est une touche mignonne. il imprime un point pour chaque fichier au lieu du nom de fichier, et maintenant il est capable de gérer n'importe quel nom de fichier et enregistre également les données; il suffit de compter les points :)| wc -c
compte les caractèresPas de tuyau, pas de copie de chaîne, pas de fourchette, juste une doublure simple
$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
Sous Linux, pour rendre la commande très robuste et gérer les fichiers qui pourraient avoir des retours à la ligne dans leur nom, utilisez ceci:
find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c
Cela nous évite la épreuve d'analyse de la sortie ls
.
En relation:
Voici une autre technique dans le sens de la celle que Gilles a postée :
Word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(Word_count *)
ce qui crée un tableau avec 13 923 éléments (si c'est le nombre de fichiers).
find . -type f -maxdepth 1 | wc -l
Cela ne peut lister que les fichiers du répertoire courant.
Amélioration de certaines réponses données précédemment mais cette fois-ci de manière explicite.
$ tree -L 1 | tail -n 1 | cut -d " " -f 3
Il convient de noter l'utilisation de certaines commandes préférées comme tail
et cut
. Notez également que l'arborescence n'est pas disponible par défaut. La commande ci-dessus capture d'abord les informations sur le répertoire au niveau 1, puis obtient la dernière ligne tail -n 1
où est notre objectif, et finissons avec cut
pour prendre le troisième mot.
Par exemple, localiser dans /
:
/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1
Alors, qu'en est-il de demander le nombre de répertoires?
Essayez ceci j'espère que cette réponse vous aidera
echo $((`ls -l | wc -l` -1 ))
Vous pouvez vérifier avec:
ls -l | grep -v ^l | wc -l