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

  • Windows 7 / Symlinks - Comment puis-je copier un Symlink dans un répertoire?
  • Existe-t-il des outils GUI pour gérer la création de liens symboliques?
  • Liaison des répertoires dans c: \ Windows sur Windows 7 64 bits
  • Windows a-t-il le ln -s ou l'équivalent?
  • Créer un lien symbolique vers le contenu fusionné de 3 dossiers
  • Windows: Déplacez les programmes (avec les entrées de registre) vers un disque dur différent
  •  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 ?

  • Liaison des répertoires dans c: \ Windows sur Windows 7 64 bits
  • Existe-t-il des outils GUI pour gérer la création de liens symboliques?
  • Windows 7 / Symlinks - Comment puis-je copier un Symlink dans un répertoire?
  • Windows a-t-il le ln -s ou l'équivalent?
  • Exécuter un lien symbolique vers exe - "Le chemin spécifié n'existe pas"
  • Quelle est la différence entre le lien symbolique et le raccourci?
  • 3 Solutions collect form web for “Comment comptabiliser séparément le nombre de fichiers, répertoires, liens symboliques et liens durs dans une seule recherche?”

    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) 
    Soyons le génie de l'ordinateur et du réseau.