1 votes

Comment compter séparément le nombre de fichiers, de répertoires, de liens symboliques et de liens en dur lors d'une seule recherche ?

Pour vérifier la réussite de la migration, j'utilise find pour compter le nombre de fichiers, de répertoires, de liens symboliques et de fichiers ayant plus d'un lien en dur. Comme les répertoires à vérifier contiennent un très grand nombre de fichiers, chaque find La course dure plusieurs heures. Je cherche donc un moyen de compter séparément le nombre de fichiers, de répertoires, de liens symboliques et de fichiers ayant plus d'un lien en dur au sein d'un même fichier. find courir.

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 en une seule fois ? find courir ?

4voto

Veera Points 5443
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 des résultats tels que :

 326 dirs
2164 files
  40 hardlinks
 164 symlinks

2voto

Daniel Beck Points 105590

Les éléments suivants devraient suffire. Il nécessite le logiciel GNU find ; sur OS X, installez par exemple findutil en 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

Un caractère sera imprimé pour chaque entrée de système de fichiers rencontrée :

  • d s'il s'agit d'un fichier
  • l s'il s'agit d'un lien symbolique
  • h s'il s'agit d'un fichier avec des liens en dur
  • f s'il s'agit d'un fichier (seulement si ce n'est pas le cas) h )

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

dfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdffffffffddfdffdfffffffffddfdldfllfdlldffffdfllfdlllllldffffdffffldfllfddffdldfddddffffflllldllllldlffffldfllfdlldffffdfllfddffddfddddfffffldfddddfffffdfddddfffffdlllldffffldfffflflllldffflfdffflfdfllfddffffldffffdfffflldfffflllldffffdffffdfffflldfllfddffdldfddddfffffdllllddflfffflldfllfddffffdffffdffffldffffdffffdffffdffffllldffffldffffdffffldffffldffffdffffdffffllllllldffffldffffdfffflllllldfffflldffddldfllfdldfffflldfffflldffffdfffflldffffdffffdfllfdlldfffflllldfllfdlldffffdfllfdlllllldffffdffdldfllfdlldfffflldfffflldffffldffffldfffflldfllfdldffffldffffldffdldffdddffddffddffddldfllfdlldffffdffffdfffflldfffflldffffdffffllldffffdffffdfllfddffffldfffflllldffffldfffflllldffffdfllfddffdldddddfffdddddfffdddddfffdddddfffdldlfffflldlffffllldfffllldffffdlffffdlffffldfffflldffdldfllfdllldffffdffffdffffldfllfdlllldfffflldfllfdldfddffffffl

Rediriger la sortie vers un fichier, et cela devient alors un simple traitement de chaîne à compter plus tard.

2voto

Florian Feldhaus Points 238

L'utilisation de la responder からして Daniel Beck J'ai développé la solution suivante qui devrait fonctionner pour la plupart des versions de find et assure également la magie du 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)

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