Compter récursivement tous les fichiers d'un répertoire [dupliquer]

199

Duplication possible:
Comment compter le nombre de dossiers dans un lecteur sous Linux?

J'ai une arborescence de répertoires très profonde sur ma machine Linux. Je voudrais compter tous les fichiers dans ce chemin, y compris tous les sous-répertoires.

Par exemple, étant donné cette arborescence de répertoires:

/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/

Si je passe /home, je voudrais qu'il renvoie quatre fichiers. Ou bien, des points bonus si elle renvoie quatre fichiers et deux répertoires. En gros, je veux l’équivalent de cliquer avec le bouton droit de la souris sur un dossier sous Windows et de sélectionner les propriétés et de voir le nombre de fichiers / dossiers contenus dans ce dossier.

Comment puis-je le faire plus facilement? J'ai une solution impliquant un script Python que j'ai écrit, mais pourquoi n'est-ce pas aussi simple que d'exécuter ls | wcou similaire?

Omghai2u
la source
Pas exactement ce que vous recherchez, mais pour obtenir un total très rapide, si votre locatebase de données est à jour: locate /some/path | wc -l(ou sur mon Mac:) locate -c /some/path. Mais: cela comptera également les fichiers /this/other/path/with/some/pathet comptera les dossiers eux-mêmes.
Arjan
À propos, il s'agit d'un problème et d'une solution différents mais étroitement liés (comptant tous les répertoires d'un lecteur): superuser.com/questions/129088/…
Amanda

Réponses:

341

find . -type f | wc -l

Explication:
find . -type frecherche tous les fichiers ( -type f ) dans ce répertoire ( . ) Et dans tous les sous-répertoires. Les noms de fichiers sont ensuite imprimés au format standard par ligne.

Ceci est ensuite canalisé | into wc(nombre de mots) l' -loption indique à wc de ne compter que les lignes de son entrée.

Ensemble, ils comptent tous vos fichiers.

Fusil
la source
1
Cela ne traite pas l’erreur "one-by-one" à cause de la dernière nouvelle ligne de la findsortie
RobertDeRose
pour compter UNIQUEMENT les répertoires, utilisez '-type d' au lieu de '-type f': D
MevlütÖzdemir
1
Quand aucun fichier n'est trouvé, le résultat est1
Dylanthepiguy
47

Les réponses ci-dessus répondent déjà à la question, mais j'ajouterai que si vous utilisez find sans arguments (à l'exception du dossier dans lequel vous souhaitez que la recherche ait lieu), procédez comme suit:

find . | wc -l

la recherche va beaucoup plus vite, presque instantanément, ou du moins le fait pour moi. En effet, la clause type doit exécuter un appel système stat () sur chaque nom pour en vérifier le type - son omission évite de le faire.

Cela a la différence de renvoyer le nombre de fichiers et de dossiers au lieu de fichiers uniquement, mais au moins pour moi, cela me suffit car je l'utilise principalement pour rechercher les dossiers qui contiennent d'énormes quantités de fichiers qui prennent un temps fou à les copier et les compresser. Compter les dossiers me permet toujours de trouver les dossiers avec la plupart des fichiers, il me faut plus de rapidité que de précision.

Francisco Vieira
la source
1
Quand aucun fichier n'est trouvé, le résultat est1
Dylanthepiguy
25

Pour les fichiers:

find -type f | wc -l

Pour les annuaires:

find -mindepth 1 -type d | wc -l

Ils travaillent tous les deux dans le répertoire de travail actuel.

cYrus
la source
1
Quand aucun fichier n'est trouvé, le résultat est1
Dylanthepiguy
8

Avec bash 4+

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    ((d++))
  elif [ -f "$file" ];then
     ((f++))
  fi
done
echo "number of files: $f"
echo "number of dirs: $d"

Pas besoin d'appeler trouver deux fois si vous voulez rechercher des fichiers et des répertoires

utilisateur31894
la source
8

Légère mise à jour de la réponse acceptée, si vous voulez un nombre de répertoires et autres

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
Rich Homolka
la source
1
Sur un Mac / BSD : find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn(Ici, le type %Test vide pour un fichier normal, un astérisque pour un fichier exécutable ou une barre oblique pour un dossier; il %HTest donc nécessaire, ou du texte supplémentaire pour éviter que l'espace ne soit compté, comme > %T. )
Arjan
Me donne "trouver: option illégale - e" sur mon mac 10.13.6
K.-Michael Aye