ACTUALIZACIÓN: hice todo eso a continuación, lo cual es genial, pero se me ocurrió una mejor manera de ordenar los directorios por uso de inodo:
du --inodes -S | sort -rh | sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
Y si quieres permanecer en el mismo sistema de archivos que haces:
du --inodes -xS
Aquí hay un ejemplo de salida:
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
AHORA CON LS:
Varias personas mencionaron que no tienen coreutils actualizados y que la opción --inodes no está disponible para ellos. Entonces, aquí está 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
Esto me proporciona resultados prácticamente idénticos al du
comando:
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:
Creo que la include
cosa solo depende del directorio en el que se ve el programa al principio, porque son los mismos archivos y están vinculados. Un poco como la cosa de arriba. Sin embargo, podría estar equivocado al respecto, y agradezco la corrección ...
El método subyacente a esto es que reemplazo cada uno de ls
los nombres de archivo con el nombre del directorio que lo contiene en sed.
Siguiente ... Bueno, yo también estoy un poco confuso. Estoy bastante seguro de que está contando con precisión los archivos, como puede ver aquí:
% _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
Haga un directorio de prueba:
% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1 .
Algunos directorios secundarios:
% mkdir ./realdir ./linkdir
% du --inodes -S
> 1 ./realdir
> 1 ./linkdir
> 1 .
Crea algunos archivos:
% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Algunos enlaces duros:
% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` |
. /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Mira los enlaces duros:
% cd ./linkdir
% du --inodes -S
> 101
% cd ../realdir
% du --inodes -S
> 101
Se cuentan solo, pero sube un directorio ...
% cd ..
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Luego ejecuté mi script de ejecución desde abajo y:
> 100 /home/mikeserv/test/realdir
> 100 /home/mikeserv/test/linkdir
> 2 /home/mikeserv/test
Y de Graeme:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
Así que creo que esto muestra que la única forma de contar inodos es por inodo. Y debido a que contar archivos significa contar inodos, no puede contar doblemente inodos: para contar archivos con precisión, los inodos no pueden contarse más de una vez.
ANTIGUO:
Encuentro esto más rápido y es portátil:
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
No es necesario -exec
para cada directorio, solo usa el sh
proceso uno y el otro find
. Tengo que obtener el set -- $glob
derecho de incluir .hidden
archivos y todo lo demás, pero está muy cerca y muy rápido. Simplemente entraría cd
en el directorio raíz que debería ser para la comprobación y listo.
Aquí hay una muestra de mi salida ejecutada desde /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
También lo uso sed
en la parte inferior para recortarlo a los 50 mejores resultados. head
sería más rápido, por supuesto, pero también recorto cada línea si es necesario:
...
159 /home/mikeserv/.config/hom...hhkdoolnlbekcfllmednbl/4.30_0/plugins
154 /home/mikeserv/.config/hom...odhpcledpamjachpmelml/1.3.11_0/js/ace
...
Es crudo, lo admito, pero fue un pensamiento. Otro dispositivo burdo que uso es el vertido 2>stderr
para ambos find
y cd
dentro 2>/dev/null
. Es más limpio que mirar errores de permisos para directorios que no puedo leer sin acceso a la raíz, tal vez debería especificar eso find
. Bueno, es un trabajo en progreso.
Ok, entonces arreglé los globos de concha así:
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
Realmente iba a hacer una pregunta sobre cómo podría hacerse, pero mientras escribía el título de la pregunta, el sitio me señaló una pregunta relacionada sugerida donde, he aquí, Stephane ya había intervenido . Entonces eso fue conveniente. Aparentemente, [^.],
aunque está bien soportado, no es portátil y debes usar el !bang.
que encontré en el comentario de Stephane allí.
De todos modos, simplemente jalar archivos ocultos no fue suficiente, obviamente. Entonces tengo que hacerlo set
dos veces para evitar buscar posicionales para el literal $glob
. Aún así, no parece afectar el rendimiento en absoluto, y agrega de manera confiable todos los archivos en el directorio.