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 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:
Penso che la include
cosa 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 ls
nomi 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 -exec
per ogni directory: utilizza solo il sh
processo ell e uno find
. Devo avere set -- $glob
ancora il diritto di includere i .hidden
file e tutto il resto, ma è molto vicino e molto veloce. Ti basta cd
inserire 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 sed
lì in basso per tagliare i primi 50 risultati. head
sarebbe 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>stderr
per entrambi find
e cd
in 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 set
due 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.