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:
du --inodes -S | sort -rh | sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
Et si vous souhaitez rester dans le même système de fichiers que vous:
du --inodes -xS
Voici quelques exemples de sortie:
15K /usr/share/man/man3
4.0K /usr/lib
3.6K /usr/bin
2.4K /usr/share/man/man1
1.9K /usr/share/fonts/75dpi
...
519 /usr/lib/python2.7/site-packages/bzrlib
516 /usr/include/KDE
498 /usr/include/qt/QtCore
487 /usr/lib/modules/3.13.6-2-MANJARO/build/include/config
484 /usr/src/linux-3.12.14-2-MANJARO/include/config
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:
sudo ls -AiR1U ./ |
sed -rn '/^[./]/{h;n;};G;
s|^ *([0-9][0-9]*)[^0-9][^/]*([~./].*):|\1:\2|p' |
sort -t : -uk1.1,1n |
cut -d: -f2 | sort -V |
uniq -c |sort -rn | head -n10
Cela me donne des résultats à peu près identiques à la du
commande:
DU:
15K /usr/share/man/man3
4.0K /usr/lib
3.6K /usr/bin
2.4K /usr/share/man/man1
1.9K /usr/share/fonts/75dpi
1.9K /usr/share/fonts/100dpi
1.9K /usr/share/doc/arch-wiki-markdown
1.6K /usr/share/fonts/TTF
1.6K /usr/share/dolphin-emu/sys/GameSettings
1.6K /usr/share/doc/efl/html
LS:
14686 /usr/share/man/man3:
4322 /usr/lib:
3653 /usr/bin:
2457 /usr/share/man/man1:
1897 /usr/share/fonts/100dpi:
1897 /usr/share/fonts/75dpi:
1890 /usr/share/doc/arch-wiki-markdown:
1613 /usr/include:
1575 /usr/share/doc/efl/html:
1556 /usr/share/dolphin-emu/sys/GameSettings:
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 la sed.
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:
% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
> 2 /home/mikeserv/test
> 1 /home/mikeserv/test/linkdir
DU DEMO
% du --version
> du (GNU coreutils) 8.22
Créez un répertoire de test:
% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1 .
Quelques répertoires enfants:
% mkdir ./realdir ./linkdir
% du --inodes -S
> 1 ./realdir
> 1 ./linkdir
> 1 .
Créez des fichiers:
% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Quelques liens physiques:
% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` |
. /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Regardez les liens physiques:
% cd ./linkdir
% du --inodes -S
> 101
% cd ../realdir
% du --inodes -S
> 101
Ils sont comptés seuls, mais remontez d'un répertoire ...
% cd ..
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Ensuite, j'ai exécuté mon script d'exécution par le bas et:
> 100 /home/mikeserv/test/realdir
> 100 /home/mikeserv/test/linkdir
> 2 /home/mikeserv/test
Et Graeme:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
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:
sh <<-\CMD
{ echo 'here='"$PWD"
printf 'cd "${here}/%s" 2>/dev/null && {
set --
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
printf "%%s\\t%%s\\n" $# "$PWD"
}\n' $( find . -depth -type d 2>/dev/null )
} | . /dev/stdin |
sort -rn |
sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
CMD
Cela n'est pas obligatoire -exec
pour tous les répertoires - il utilise uniquement un sh
processus ell et un find
. Je dois encore obtenir le set -- $glob
droit d'inclure des .hidden
fichiers et tout le reste, mais c'est très proche et très rapide. Vous feriez juste cd
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
:
14684 /usr/share/man/man3
4322 /usr/lib
3650 /usr/bin
2454 /usr/share/man/man1
1897 /usr/share/fonts/75dpi
...
557 /usr/share/gtk-doc/html/gtk3
557 /usr/share/doc/elementary/latex
539 /usr/lib32/wine/fakedlls
534 /usr/lib/python2.7/site-packages/bzrlib
500 /usr/lib/python3.3/test
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:
...
159 /home/mikeserv/.config/hom...hhkdoolnlbekcfllmednbl/4.30_0/plugins
154 /home/mikeserv/.config/hom...odhpcledpamjachpmelml/1.3.11_0/js/ace
...
C'est grossier, certes, mais c'était une pensée. Un autre appareil brut que j'utilise est le dumping 2>stderr
pour find
et cd
dans 2>/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écifier find
. Eh bien, c'est un travail en cours.
Ok, j'ai donc réparé les globes shell comme ceci:
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
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.