Question Compter récursivement tous les fichiers dans un répertoire [dupliquer]


Duplication possible:
Comment puis-je compter le nombre de dossiers dans un lecteur utilisant 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, compte tenu de 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, des points bonus s’il renvoie quatre fichiers et deux répertoires. Fondamentalement, je veux l'équivalent de cliquer avec le bouton droit sur un dossier sous Windows et de sélectionner les propriétés et voir combien de fichiers / dossiers sont contenus dans ce dossier.

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


165
2017-10-12 21:41


origine


Pas exactement ce que vous recherchez, mais pour obtenir un très grand total, si votre locate la base de données est à jour: locate /some/path | wc -l (ou sur mon Mac: locate -c /some/path). Mais: cela comptera aussi les fichiers dans /this/other/path/with/some/path, et comptera les dossiers eux-mêmes. - Arjan
Par ailleurs, il s’agit d’un problème différent, mais étroitement lié (en comptant tous les répertoires d’un lecteur) et d’une solution: superuser.com/questions/129088/ - Amanda


Réponses:


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 en standard sur une par ligne.

Ceci est ensuite canalisé | dans wc (mot compte) le -l L'option indique à wc de ne compter que les lignes de son entrée.

Ensemble, ils comptent tous vos fichiers.


289
2017-10-12 21:44





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) comme dans:

find . | wc -l

la recherche va beaucoup plus vite, presque instantanément, ou du moins 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 - le fait de l'omettre évite de le faire.

Cela a la différence de renvoyer le nombre de fichiers plus les dossiers au lieu des seuls fichiers, mais au moins pour moi, cela suffit, car je les utilise surtout pour trouver les dossiers qui contiennent d'énormes quantités de fichiers. Compter les dossiers me permet toujours de trouver les dossiers avec la plupart des fichiers, j'ai besoin de plus de rapidité que de précision.


42
2018-03-28 22:00





Pour les fichiers:

find -type f | wc -l

Pour les répertoires:

find -mindepth 1 -type d | wc -l

Ils travaillent tous deux dans le répertoire de travail en cours.


24
2017-10-12 21:56





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 souhaitez rechercher des fichiers et des répertoires


8
2017-10-13 01:58





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

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

7
2017-10-13 14:26



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