Comment comptabiliser séparément le nombre de fichiers, répertoires, liens symboliques et liens durs dans une seule recherche?

Pour vérifier une migration réussie, j'utilise find pour compter le nombre de fichiers, de répertoires, de liens symboliques et de fichiers avec plus d'un lien dur. Comme les répertoires à vérifier contiennent un nombre énorme de fichiers, chaque exécution de find dure plusieurs heures. Je recherche donc un moyen de compter séparément le nombre de fichiers, de répertoires, de liens symboliques et de fichiers avec plus d'un lien dur dans une seule exécution de find .

Voici ce que je fais actuellement

 num_files=$(find $directory -type f | wc -l) num_directories=$(find $directory -type d | wc -l) num_symlinks=$(find $directory -type l | wc -l) num_hardlinks=$(find $directory -type f -links +1 | wc -l) 

Comment puis-je obtenir ces quatre compteurs dans une course de find ?

Ce qui suit devrait le faire. Il faut que GNU find ; Sur OS X, installez par exemple findutil utilisant Homebrew.

 find $directory -type d -printf d -o -type l -printf l -o -type f -links +1 -printf h -o -type f -printf f 

Cela va imprimer un caractère par entrée du système de fichiers rencontré:

  • d s'il s'agit d'un fichier
  • l si c'est un lien symbolique
  • h s'il s'agit d'un fichier avec des liens difficiles
  • f s'il s'agit d'un fichier (seulement si non h )

La sortie ressemble à ceci (extrait réel sur mon système):

dfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdffffffffddfdffdfffffffffddfdldfllfdlldffffdfllfdlllllldffffdffffldfllfddffdldfddddffffflllldllllldlffffldfllfdlldffffdfllfddffddfddddfffffldfddddfffffdfddddfffffdlllldffffldfffflflllldffflfdffflfdfllfddffffldffffdfffflldfffflllldffffdffffdfffflldfllfddffdldfddddfffffdllllddflfffflldfllfddffffdffffdffffldffffdffffdffffdffffllldffffldffffdffffldffffldffffdffffdffffllllllldffffldffffdfffflllllldfffflldffddldfllfdldfffflldfffflldffffdfffflldffffdffffdfllfdlldfffflllldfllfdlldffffdfllfdlllllldffffdffdldfllfdlldfffflldfffflldffffldffffldfffflldfllfdldffffldffffldffdldffdddffddffddffddldfllfdlldffffdffffdfffflldfffflldffffdffffllldffffdffffdfllfddffffldfffflllldffffldfffflllldffffdfllfddffdldddddfffdddddfffdddddfffdddddfffdldlfffflldlffffllldfffllldffffdlffffdlffffldfffflldffdldfllfdllldffffdffffdffffldfllfdlllldfffflldfllfdldfddffffffl

Rediriger la sortie vers un fichier, puis il devient un traitement de chaîne simple à compter plus tard.

 find $directory -type d -exec echo dirs \; -o -type l -exec echo symlinks \; -o -type f -links +1 -exec echo hardlinks \; -o -type f -exec echo files \; | sort | uniq -c 

Produit comme sortie:

  326 dirs 2164 files 40 hardlinks 164 symlinks 

En utilisant la réponse de Daniel Beck, j'ai développé la solution suivante qui devrait fonctionner pour la plupart des versions de find et fournit également la magie de comptage:

 output=$(find $directory -type d -exec printf d \; -o -type l -exec printf l \; -o -type f -links +1 -exec printf h \; -o -type f -exec printf f \;) num_files=$(echo $output | grep -o "f" | wc -l) num_directories=$(echo $output | grep -o "d" | wc -l) num_symlinks=$(echo $output | grep -o "l" | wc -l) num_hardlinks=$(echo $output | grep -o "h" | wc -l)