web-dev-qa-db-fra.com

Comment puis-je obtenir un nombre de fichiers dans un répertoire en utilisant la ligne de commande?

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?

219
Blake

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 //
279
James Roth

Pour une définition étroite du fichier:

 find . -maxdepth 1 -type f | wc -l
35
Maciej Piechotka
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>

15
nicomen

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.

12
krlmlr

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 fichier

Pour 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)

12
Frax

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
5
Jbnair

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.

4
lev
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ères
3
aude

Pas 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
1
DaboD

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:

1
codeforester

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.

1
srpatch

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?

0
jonaprieto

Essayez ceci j'espère que cette réponse vous aidera

echo $((`ls -l | wc -l` -1 ))
0
Tiger

Vous pouvez vérifier avec:

ls -l | grep -v ^l | wc -l
0
AMIC MING