240 votes

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

Duplicata 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 de 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 dans /home j'aimerais qu'il renvoie quatre fichiers. Ou, points bonus si elle renvoie quatre fichiers et deux répertoires. En gros, je veux l'équivalent d'un clic droit sur un dossier dans Windows et de la sélection des propriétés pour voir combien de fichiers/dossiers sont contenus dans ce dossier.

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

0 votes

Ce n'est pas exactement ce que vous recherchez, mais pour obtenir un grand total très rapide, si su locate est à jour : locate /some/path | wc -l (ou sur mon Mac : locate -c /some/path ). Mais : cela comptera également les fichiers dans /this/other/path/with/some/path et comptera les dossiers eux-mêmes.

0 votes

À propos, il s'agit d'un problème différent, mais étroitement lié (compter tous les répertoires sur un lecteur) et d'une solution : superuser.com/questions/129088/

397voto

user2013 Points 2301

find . -type f | wc -l

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

Il est ensuite acheminé | sur wc (nombre de mots) le -l L'option indique à wc de ne compter que les lignes de son entrée.

Ensemble, ils comptent tous vos fichiers.

3 votes

Cela ne résout pas le problème de l'erreur "off-by-one" à cause du dernier saut de ligne de l'instruction find sortie

0 votes

Pour compter les répertoires UNIQUEMENT, utilisez '-type d' au lieu de '-type f' :D

2 votes

Si aucun fichier n'est trouvé, le résultat est le suivant 1

49voto

Jofurs Points 1

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

find . | wc -l

la recherche est beaucoup plus rapide, presque instantanée, en tout cas pour moi. Cela est dû au fait que la clause de type doit exécuter 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 renvoyer le nombre de fichiers et de dossiers au lieu de seulement les fichiers, mais au moins pour moi c'est suffisant puisque je l'utilise principalement pour trouver les dossiers qui ont des quantités énormes de fichiers qui prennent une éternité à copier et à compresser. Compter les dossiers me permet toujours de trouver les dossiers avec le plus de fichiers, j'ai besoin de plus de vitesse que de précision.

1 votes

Si aucun fichier n'est trouvé, le résultat est le suivant 1

0 votes

Huh, pour moi il n'y a pas de différence dans la vitesse

26voto

cYrus Points 20338

Pour les dossiers :

find -type f | wc -l

Pour les répertoires :

find -mindepth 1 -type d | wc -l

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

1 votes

Si aucun fichier n'est trouvé, le résultat est le suivant 1

8voto

user31894 Points 2591

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"

Il n'est pas nécessaire d'appeler find deux fois si vous voulez rechercher des fichiers et des répertoires.

8voto

Lark Points 1640

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

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

1 votes

Sur un Mac/BSD : find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn (Ici, le type %T est vide pour un fichier ordinaire, un astérisque pour un fichier exécutable, ou une barre oblique pour un dossier ; par conséquent, l'option %HT est nécessaire, ou un texte supplémentaire pour éviter que l'espace ne soit pas compté, par exemple > %T .)

0 votes

Donne "find : illegal option -- e" sur mon mac 10.13.6

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X