Esto se vuelve a publicar desde aquí a instancias del autor de la pregunta:
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:
ls ~/test -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
Si tiene curiosidad, el corazón y el alma de ese tedioso trozo de regex
allí está reemplazando el filename
de cada uno de ls's
los resultados de búsqueda recursiva con el nombre del directorio en el que se encontró. A partir de ahí, solo es cuestión de apretar números de inodo repetidos y luego contar nombres de directorio repetidos y ordenarlos en consecuencia.
La -U
opción es especialmente útil con la clasificación, ya que específicamente no se clasifica, y en su lugar presenta la lista de directorios en orden original, o, en otras palabras, por inode
número.
Y, por supuesto, -1
es increíblemente útil, ya que garantiza un único resultado por línea, independientemente de las posibles nuevas líneas incluidas en los nombres de archivo u otros problemas espectacularmente desafortunados que pueden ocurrir cuando intenta analizar una lista.
Y, por supuesto, -A
para todos y -i
para el inodo y -R
para el recursivo y eso es todo.
El método subyacente a esto es que reemplazo cada uno de los nombres de archivo de ls con su nombre de directorio que contiene en sed. Después de eso ... Bueno, yo también estoy un poco confusa. 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
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 ...
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.