Comment puis-je utiliser find
pour générer une liste de répertoires contenant le plus grand nombre de fichiers. J'aimerais que la liste soit du plus haut au plus bas. Je voudrais seulement que la liste atteigne 1 niveau de profondeur, et j'exécute généralement cette commande à partir du haut de mon système de fichiers, c'est-à-dire /
.
21
Réponses:
Utilisation des outils GNU:
Cela utilise deux
find
commandes. Le premier recherche les répertoires et les redirige vers unewhile
boucle exécute la recherche suivante pour chaque répertoire. Le second répertorie tous les fichiers / répertoires enfants du premier niveau tout en lesgrep
comptant. Legrep
permet-print0
d'être utilisé avec la deuxième recherche carwc
n'a pas d'-z
équivalent. Cela empêche les noms de fichiers avec une nouvelle ligne d'être comptés deux fois (bien que l'utilisationwc
et non ne-print0
ferait pas beaucoup de différence).Le résultat de la seconde
find
est placé dans l'argument pourecho
ainsi et le nom du répertoire peut facilement être placé sur la même ligne (la$(..)
construction coupe automatiquement la nouvelle ligne à la fin degrep
). Les lignes sont ensuite triées par numéro et les 50 plus grands nombres sont indiqués parhead
.Notez que cela inclura également les répertoires de niveau supérieur des points de montage. Un moyen simple de contourner ce problème consiste à utiliser un montage de liaison, puis à utiliser le répertoire du montage. Pour faire ça:
Une solution plus portable utilise une instance de shell différente pour chaque répertoire (également répondu ici ):
Exemple de sortie:
la source
MISE À JOUR: J'ai fait tout cela ci-dessous, ce qui est cool, mais j'ai trouvé une meilleure façon de trier les répertoires par utilisation des inodes:
Et si vous souhaitez rester dans le même système de fichiers que vous:
Voici quelques exemples de sortie:
MAINTENANT AVEC LS:
Plusieurs personnes ont indiqué qu'elles n'avaient pas de coreutils à jour et que l'option --inodes n'était pas disponible pour elles. Alors, voici ls:
Cela me donne des résultats à peu près identiques à la
du
commande:DU:
LS:
Je pense que la
include
chose dépend simplement du répertoire dans lequel le programme regarde en premier - car ce sont les mêmes fichiers et liés en dur. Un peu comme la chose ci-dessus. Je peux me tromper à ce sujet - et je me réjouis de la correction ...La méthode sous-jacente à cela est que je remplace chacun des
ls
noms de fichiers par son nom de répertoire contenant dans lased.
suite de cela ... Eh bien, je suis un peu flou moi-même. Je suis assez certain qu'il compte précisément les fichiers, comme vous pouvez le voir ici:DU DEMO
Créez un répertoire de test:
Quelques répertoires enfants:
Créez des fichiers:
Quelques liens physiques:
Regardez les liens physiques:
Ils sont comptés seuls, mais remontez d'un répertoire ...
Ensuite, j'ai exécuté mon script d'exécution par le bas et:
Et Graeme:
Je pense donc que cela montre que la seule façon de compter les inodes est par inode. Et parce que compter des fichiers signifie compter des inodes, vous ne pouvez pas compter doublement les inodes - pour compter des fichiers avec précision, les inodes ne peuvent pas être comptés plus d'une fois.
VIEUX:
Je trouve ça plus rapide, et c'est portable:
Cela n'est pas obligatoire
-exec
pour tous les répertoires - il utilise uniquement unsh
processus ell et unfind
. Je dois encore obtenir leset -- $glob
droit d'inclure des.hidden
fichiers et tout le reste, mais c'est très proche et très rapide. Vous feriez justecd
quelque chose dans votre répertoire racine pour la vérification et c'est parti.Voici un échantillon de ma sortie de sortie de
/usr
:J'utilise également
sed
en bas là pour le couper aux 50 premiers résultats.head
serait plus rapide, bien sûr, mais je coupe aussi chaque ligne si nécessaire:C'est grossier, certes, mais c'était une pensée. Un autre appareil brut que j'utilise est le dumping
2>stderr
pourfind
etcd
dans2>/dev/null
. C'est juste plus propre que de regarder les erreurs d'autorisations pour les répertoires que je ne peux pas lire sans accès root - je devrais peut-être le spécifierfind
. Eh bien, c'est un travail en cours.Ok, j'ai donc réparé les globes shell comme ceci:
J'allais en fait poser une question sur la façon dont cela pourrait être fait, mais pendant que je tapais le titre de la question, le site m'a indiqué une question connexe suggérée où, voilà, Stéphane avait déjà pesé . C'était donc pratique. Apparemment
[^.],
bien supporté, il n'est pas portable et vous devez utiliser le!bang.
j'ai trouvé dans le commentaire de Stéphane.Quoi qu'il en soit, il n'était évidemment pas suffisant d'extraire des fichiers cachés. Je dois donc le faire
set
deux fois afin d'éviter de rechercher des positions pour le littéral$glob
. Pourtant, cela ne semble pas affecter les performances du tout, et il ajoute de manière fiable tous les fichiers du répertoire.la source
ls -i
et ... je suppose ... probablementgrep
... peut-être - eh bien, vous utilisez-xdev,
ce qui est un début ...uniq
etsort
?du
utilisez-vous? Mondu
n'a pas d'--inodes
option.Pourquoi ne pas utiliser quelque chose comme KDirStat Bien qu'il ait été écrit à l'origine pour KDE mais qu'il fonctionne bien avec GNOME également Il vous donne la meilleure vue du nombre de fichiers / dir et de l'utilisation respective dans l'interface graphique
la source