web-dev-qa-db-fra.com

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

Duplicate 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 en /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 | wc ou similaire?

180
omghai2u

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 ensuite imprimés au format standard par ligne.

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

Ensemble, ils comptent tous vos fichiers.

317
Nifle

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. Cela est dû au fait que la clause type doit exécuter un appel système stat () sur chaque nom pour vérifier son type - son omission l’évite.

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.

46
Francisco Vieira

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.

25
cYrus

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
8
Rich Homolka

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

8
user31894