web-dev-qa-db-fra.com

Comment compter le nombre total de fichiers / dossiers sur un système?

Comment puis-je compter le nombre de tous les fichiers/dossiers existant sur un système à l'aide de la ligne de commande?

Je peux le trouver en utilisant une interface graphique, en ouvrant simplement la fenêtre de propriétés du dossier entier /, mais il serait bien de savoir comment le faire en utilisant la ligne de commande.

Aurais-je besoin de toute une série de commandes ou une seule sera-t-elle possible?

7
TellMeWhy

Les noms de fichiers/dossiers pouvant contenir des nouvelles lignes:

Sudo find / -type f -printf '.' | wc -c
Sudo find / -type d -printf '.' | wc -c

Cela comptera tout fichier/dossier dans le répertoire actuel /. Mais comme le souligne muru, vous voudrez peut-être exclure les systèmes de fichiers virtuels/autres du compte (les éléments suivants excluront tout autre système de fichiers monté):

find / -xdev -type f -printf '.' | wc -c
find / -xdev -type d -printf '.' | wc -c
  • Sudo find / -type f -printf '.': imprime un point pour chaque fichier dans /;
  • Sudo find / -type d -printf '.': imprime un point pour chaque dossier dans /;
  • wc -c: compte le nombre de caractères.

Voici un exemple montrant comment le fait de ne pas prendre en compte les retours à la ligne dans les noms de fichiers/dossiers peut empêcher d'autres méthodes telles que, par exemple, de s'exécuter. find / -type f | wc -l et comment utiliser find / -type f -printf '.' | wc -c donne raison:

% ls
% touch "file
\`dquote> with newline"
% find . -type f | wc -l
2
% find . -type f -printf '.' | wc -c
1

Si STDOUT n'est pas un terminal, find affichera chaque nom de fichier/dossier à la lettre; cela signifie qu'un nom de fichier/dossier contenant une nouvelle ligne sera imprimé sur deux lignes différentes et que wc -l comptera deux lignes pour un seul fichier/dossier, pour finalement imprimer un résultat par une.

11
kos

1 méthode serait

Sudo find / -type f | wc -l
Sudo find / -type d | wc -l

(Sudo pour empêcher les erreurs d'accès)

f pour les fichiers, d pour les répertoires.

Le système/proc/filesystem générera une erreur, mais je ne considère pas ces fichiers;)

7
Rinzwind

Si vous voulez vraiment le nombre total dans vos systèmes de fichiers, utilisez df -i pour compter les inodes. Vous n'obtiendrez pas la répartition entre les répertoires et les fichiers ordinaires, mais le côté positif est quasiment instantané. Le nombre total d'inodes utilisés est quelque chose que les systèmes de fichiers suivent déjà.


Si vous souhaitez utiliser l'une des suggestions basées sur find, ne l'exécutez pas simplement sur /. Utilisez find -xdev sur une liste de points de montage générés par quelque chose comme findmnt --list -v -U -t xfs,ext3,ext4,btrfs,vfat,ntfs -o TARGET ou quelque chose d'autre. Cela n'exclut pas les montages liés, donc les fichiers sous des montages liés seront comptés deux fois. findmntc'est plutôt cool.

En outre, il existe sûrement un moyen simple de répertorier tous vos montages "sur disque" sans avoir à répertorier les types de système de fichiers explicites, mais je ne sais pas exactement quoi.

Comme suggéré par une autre réponse, utilisez find -printf . | wc -c pour éviter tout problème de comptage de caractères amusants dans les noms de fichiers. Utilisez -not -type d pour compter les fichiers autres que des répertoires. (Vous ne voulez pas exclure vos liens symboliques, n'est-ce pas?)

5
Peter Cordes
Sudo find / -type f | wc -l

vous dira le nombre de fichiers réguliers sur votre système, et

Sudo find / -type d | wc -l

le nombre de dossiers.

4
Florian Diesch

Utiliser zsh:

Comme root, pour les fichiers ordinaires:

files=( /**/*(.D) )

cela prendra tous les fichiers normaux, y compris ceux commençant par . dans le tableau files, maintenant nous pouvons simplement compter le nombre d'éléments du tableau:

echo $#files

cela traitera tous les cas Edge, par exemple. noms de fichiers inhabituels.

De même pour les annuaires:

dirs=( /**/*(/D) )
echo $#dirs
2
heemayl

Une autre approche qui exploite locatedb:

locate / | wc -l

Avantages:

  • Ne nécessite pas de Sudo
  • Beaucoup plus rapide que les approches basées sur find (déjà pré-indexé)
  • Applique déjà -xdev: ignore les fichiers spéciaux: /dev, /proc etc.

Inconvénients:

  • Non précis à 100%: inclut les répertoires, saute les fichiers sous /tmp, peut doubler ou compter plus de fichiers avec des nouvelles lignes dans leur nom, par exemple
  • Plus lent que l'approche df -i
  • Reflète "la réalité de l'instantané ~ 24 heures" au lieu de l'état actuel exact
2
arielf