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?
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.
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;)
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. findmnt
c'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?)
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.
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
Une autre approche qui exploite locatedb
:
locate / | wc -l
Avantages:
find
(déjà pré-indexé)-xdev
: ignore les fichiers spéciaux: /dev
, /proc
etc.Inconvénients:
/tmp
, peut doubler ou compter plus de fichiers avec des nouvelles lignes dans leur nom, par exempledf -i