अद्यतन: मैंने वह सब नीचे किया, जो शांत है, लेकिन मैं इनोड द्वारा निर्देशिकाओं को छांटने का एक बेहतर तरीका लेकर आया हूं:
du --inodes -S | sort -rh | sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
और यदि आप उसी फाइल सिस्टम में रहना चाहते हैं जो आप करते हैं:
du --inodes -xS
यहाँ कुछ उदाहरण आउटपुट है:
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
अब 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
यह मुझे 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
लोकसभा:
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:
मुझे लगता है कि यह include
बात सिर्फ इस बात पर निर्भर करती है कि कार्यक्रम किस निर्देशिका में दिखता है - क्योंकि वे एक ही फाइल और हार्डलिंक हैं। ऊपर की चीज जैसी किंदा। हालांकि, मैं इसके बारे में गलत हो सकता हूं - और मैं सुधार का स्वागत करता हूं ...
इसके लिए अंतर्निहित विधि यह है कि मैं हर एक ls
फ़ाइल नाम को उसके निर्देशिका नाम के साथ sed.
उस पर बाद में प्रतिस्थापित कर रहा हूँ ... ठीक है, मैं अपने आप को थोड़ा फजी हूँ। मैं काफी हद तक निश्चित रूप से फाइलों को गिन रहा हूं, जैसा कि आप यहां देख सकते हैं:
% _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
एक परीक्षण निर्देशिका बनाएं:
% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1 .
कुछ बच्चे निर्देशिका:
% mkdir ./realdir ./linkdir
% du --inodes -S
> 1 ./realdir
> 1 ./linkdir
> 1 .
कुछ फाइलें बनाएं:
% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
कुछ हार्डलिंक:
% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` |
. /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
हार्डलिंक को देखें:
% cd ./linkdir
% du --inodes -S
> 101
% cd ../realdir
% du --inodes -S
> 101
वे अकेले ही गिने जाते हैं, लेकिन एक निर्देशिका ऊपर ले जाओ ...
% cd ..
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
फिर मैंने नीचे से अपनी भागा स्क्रिप्ट चलायी और:
> 100 /home/mikeserv/test/realdir
> 100 /home/mikeserv/test/linkdir
> 2 /home/mikeserv/test
और ग्रीम:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
इसलिए मुझे लगता है कि यह दिखाता है कि इनोड को गिनने का एकमात्र तरीका इनोड है। और क्योंकि फाइलों की गिनती का मतलब है कि इनोड्स को गिनना, आप इनकोड को दोगुना नहीं कर सकते - फाइलों को सही तरीके से गिनने के लिए एक से अधिक बार काउंट नहीं किया जा सकता है।
पुराना:
मुझे यह तेज़ लगता है, और यह पोर्टेबल है:
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
यह -exec
हर निर्देशिका के लिए नहीं है - यह केवल एक sh
ell प्रक्रिया और एक का उपयोग करता है find
। मुझे फ़ाइलों और अन्य सभी set -- $glob
को शामिल करने का अधिकार अभी भी प्राप्त करना .hidden
है, लेकिन यह बहुत करीब है और बहुत तेज है। आप cd
अपने रूट डायरेक्टरी में सिर्फ उस चेक और ऑफ के लिए जाने चाहिए जो आप जाते हैं।
यहाँ से मेरे आउटपुट रन का एक नमूना है /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
मैं sed
नीचे के शीर्ष 50 परिणामों पर ट्रिम करने के लिए वहां भी उपयोग करता हूं । head
निश्चित रूप से तेज़ होगा, लेकिन यदि आवश्यक हो तो मैं प्रत्येक पंक्ति को भी ट्रिम कर दूंगा:
...
159 /home/mikeserv/.config/hom...hhkdoolnlbekcfllmednbl/4.30_0/plugins
154 /home/mikeserv/.config/hom...odhpcledpamjachpmelml/1.3.11_0/js/ace
...
यह क्रूड है, बेशक, लेकिन यह एक सोच थी। मेरे द्वारा उपयोग किया जाने वाला एक और क्रूड डिवाइस डंपिंग और इन 2>stderr
दोनों के लिए है । यह केवल निर्देशिकाओं के लिए अनुमतियों की त्रुटियों को देखने की तुलना में क्लीनर है जिसे मैं रूट एक्सेस के बिना नहीं पढ़ सकता हूं - शायद मुझे यह निर्दिष्ट करना चाहिए । खैर, यह एक कार्य प्रगति पर है।find
cd
2>/dev/null
find
ठीक है, इसलिए मैंने शेल ग्लब्स को इस तरह से ठीक किया:
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
मैं वास्तव में एक सवाल पूछने जा रहा था कि यह कैसे किया जा सकता है, लेकिन जैसा कि मैं सवाल शीर्षक में टाइप कर रहा था, साइट ने मुझे एक सुझाव से संबंधित प्रश्न पर इशारा किया , जहां, लो और निहारना, स्टीफन ने पहले ही तौला था । इसलिए यह सुविधाजनक था। जाहिरा तौर [^.],
पर अच्छी तरह से समर्थन करते हुए, पोर्टेबल नहीं है और आपको !bang.
स्टीफन की टिप्पणी में मुझे वहां पाया गया उपयोग करना होगा।
वैसे भी, छिपी हुई फ़ाइलों में बस खींचना पर्याप्त नहीं था, जाहिर है। इसलिए मुझे set
शाब्दिक के लिए खोज स्थिति से बचने के लिए दो बार करना पड़ता है $glob
। फिर भी, यह प्रदर्शन को प्रभावित नहीं करता है, और यह निर्देशिका में हर फ़ाइल को मज़बूती से जोड़ता है।