AGGIORNAMENTO: Ho fatto tutto ciò di seguito, il che è bello, ma ho trovato un modo migliore di ordinare le directory per uso degli inode:
du --inodes -S | sort -rh | sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
E se vuoi rimanere nello stesso filesystem fai:
du --inodes -xS
Ecco alcuni esempi di output:
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
ORA CON LS:
Diverse persone hanno affermato di non avere coreutils aggiornati e l'opzione --inodes non è disponibile per loro. Quindi, ecco 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
Questo mi sta fornendo risultati praticamente identici al ducomando:
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:
Penso che la includecosa dipenda solo dalla directory in cui il programma guarda prima - perché sono gli stessi file e hardlinked. Piace la cosa sopra. Potrei sbagliarmi però - e accolgo con favore la correzione ...
Il metodo alla base di questo è che sostituisco ognuno dei lsnomi di file con il suo nome di directory contenente in sed.seguito da quello ... Beh, sono un po 'sfocato anch'io. Sono abbastanza certo che sta contando accuratamente i file, come puoi vedere qui:
% _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
Crea una directory di prova:
% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1 .
Alcune directory per bambini:
% mkdir ./realdir ./linkdir
% du --inodes -S
> 1 ./realdir
> 1 ./linkdir
> 1 .
Crea alcuni file:
% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Alcuni hardlink:
% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` |
. /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Guarda i collegamenti:
% cd ./linkdir
% du --inodes -S
> 101
% cd ../realdir
% du --inodes -S
> 101
Sono contati da soli, ma vanno in alto di una directory ...
% cd ..
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Quindi ho eseguito il mio script run dal basso e:
> 100 /home/mikeserv/test/realdir
> 100 /home/mikeserv/test/linkdir
> 2 /home/mikeserv/test
E Graeme's:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
Quindi penso che ciò dimostri che l'unico modo per contare gli inode è l'inode. E poiché contare i file significa contare gli inode, non è possibile contare doppiamente gli inode - per contare i file con precisione gli inode non possono essere conteggiati più di una volta.
VECCHIO:
Lo trovo più velocemente ed è portatile:
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
Non è necessario -execper ogni directory: utilizza solo il shprocesso ell e uno find. Devo avere set -- $globancora il diritto di includere i .hiddenfile e tutto il resto, ma è molto vicino e molto veloce. Ti basta cdinserire la directory principale per il controllo e il gioco è fatto.
Ecco un esempio del mio output eseguito da /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
Uso anche sedlì in basso per tagliare i primi 50 risultati. headsarebbe più veloce, ovviamente, ma taglio anche ogni riga se necessario:
...
159 /home/mikeserv/.config/hom...hhkdoolnlbekcfllmednbl/4.30_0/plugins
154 /home/mikeserv/.config/hom...odhpcledpamjachpmelml/1.3.11_0/js/ace
...
È rozzo, è vero, ma era un pensiero. Un altro uso Ho dispositivo greggio è dumping 2>stderrper entrambi finde cdin 2>/dev/null. È solo più pulito che guardare gli errori di autorizzazione per le directory che non posso leggere senza accesso root - forse dovrei specificarlo find. Bene, è un work in progress.
Ok, quindi ho corretto i globs della shell in questo modo:
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
In realtà stavo per fare una domanda su come si potesse fare, ma mentre scrivevo il titolo della domanda il sito mi ha indicato una domanda correlata suggerita in cui, ecco, Stephane aveva già ponderato . Quindi era conveniente. Apparentemente [^.],ben supportato, non è portatile e devi usare quello che !bang.ho trovato nel commento di Stephane lì.
Ad ogni modo, semplicemente inserire file nascosti non era abbastanza, ovviamente. Quindi devo fare setdue volte per evitare di cercare i letterali per il letterale $glob. Tuttavia, non sembra influenzare affatto le prestazioni e aggiunge in modo affidabile tutti i file nella directory.