2010-10-12 21:41:12 +0000 2010-10-12 21:41:12 +0000
217
217

Comptez récursivement tous les fichiers d'un répertoire

Doublon possible: Comment puis-je compter le nombre de dossiers d'un lecteur sous Linux ?

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

Par exemple, étant donné cette arborescence :

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

Si je passe dans /home, je voudrais qu'il renvoie quatre fichiers. Ou bien, des points bonus s'il renvoie quatre fichiers et deux répertoires. En gros, je veux l'équivalent d'un clic droit sur un dossier de Windows et de la sélection des propriétés et de voir combien de fichiers/dossiers sont contenus dans ce dossier.

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

Réponses (5)

364
364
364
2010-10-12 21:44:53 +0000

find . -type f | wc -l

Explication : find . -type f trouve tous les fichiers ( type f ) dans ce répertoire ( . ) et dans tous les sous-répertoires, les noms de fichiers sont alors imprimés de manière standard, un par ligne.

Ceci est ensuite transmis | dans wc (comptage de mots) l'option -l indique à wc de ne compter que les lignes de son entrée.

Ensemble, ils comptent tous vos fichiers.

49
49
49
2011-03-28 22:00:38 +0000

Les réponses ci-dessus répondent déjà à la question, mais j'ajouterai que si vous utilisez la recherche sans arguments (sauf pour le dossier où vous voulez que la recherche se fasse) comme dans :

find . | wc -l

la recherche va beaucoup plus vite, presque instantanément, ou du moins elle le fait pour moi. C'est parce que la clause de type doit lancer un appel système stat() sur chaque nom pour vérifier son type - l'omettre évite de le faire.

Cela a la différence de retourner le nombre de fichiers plus les dossiers au lieu de seulement les fichiers, mais au moins pour moi c'est suffisant puisque je l'utilise surtout pour trouver quels dossiers ont une énorme quantité de fichiers qui prennent une éternité à les copier et à les compresser. Le comptage des dossiers me permet toujours de trouver les dossiers contenant la plupart des fichiers, j'ai besoin de plus de vitesse que de précision.

26
26
26
2010-10-12 21:56:03 +0000

Pour les fichiers :

find -type f | wc -l

Pour les répertoires :

find -mindepth 1 -type d | wc -l

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

8
8
8
2010-10-13 01:58:12 +0000

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 deux fois “find” si vous voulez rechercher des fichiers et des répertoires

8
8
8
2010-10-13 14:26:17 +0000

Légère mise à jour de la réponse acceptée, si vous voulez un décompte des dirs et autres

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn