আপডেট: আমি নীচের সমস্তগুলি করেছি, যা দুর্দান্ত, তবে আমি ইনোড ব্যবহারের মাধ্যমে ডিরেক্টরি বাছাই করার আরও ভাল উপায় নিয়ে হাজির হয়েছি:
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
এখন এলএস এর সাথে:
বেশ কয়েকটি ব্যক্তি উল্লেখ করেছেন যে তাদের কাছে আপ টু ডেট কোরিউটিল নেই এবং --inodes বিকল্প তাদের কাছে উপলভ্য নয়। সুতরাং, এখানে 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
নির্মিত 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:
আমি মনে করি যে include
প্রোগ্রামটি প্রথমে কোন ডিরেক্টরিটি দেখায় তার উপরে বিষয়টি নির্ভর করে - কারণ তারা একই ফাইল এবং হার্ডলিঙ্কযুক্ত। উপরের জিনিস পছন্দ মত। যদিও আমি এই সম্পর্কে ভুল হতে পারি - এবং আমি সংশোধন স্বাগত জানাই ...
এর অন্তর্নিহিত পদ্ধতিটি হ'ল আমি প্রতিটি ls
ফাইলের নামের সাথে এর ডিরেক্টরিটি নাম যুক্ত sed.
করে সেই থেকে অনুসরণ করে প্রতিস্থাপন করছি ... ভাল, আমি নিজেই কিছুটা অস্পষ্ট। আমি মোটামুটি নিশ্চিত যে এটি সঠিকভাবে ফাইলগুলি গণনা করছে, আপনি এখানে দেখতে পারেন:
% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
> 2 /home/mikeserv/test
> 1 /home/mikeserv/test/linkdir
Uাবির ডেমো
% 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
এল প্রক্রিয়া এবং একটি ব্যবহার করে 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
। আমি ডিরেক্টরিতে অ্যাক্সেস ছাড়াই পড়তে পারি না এমন ডিরেক্টরিগুলির জন্য অনুমতি ত্রুটিগুলি দেখার চেয়ে এটি কেবল পরিষ্কার perhaps সম্ভবত আমার এটি নির্দিষ্ট করা উচিত find
। ঠিক আছে, এটি একটি কাজ চলছে।
ঠিক আছে, তাই আমি শেল গ্লোবগুলি এর মতো ঠিক করেছি:
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
আমি আসলে এটা কিভাবে কাজ করা যেতে পারে একটি প্রশ্ন জিজ্ঞাসা করতে যাচ্ছিলাম, কিন্তু আমি প্রশ্ন শিরোনাম টাইপ ছিল সাইটের আমাকে একটা তীক্ষ্ন প্রস্তাব সংশ্লিষ্ট প্রশ্ন যেখানে, নিম্ন এবং দেখ দেখ, স্টিফেন ইতিমধ্যে খতিয়ে । সুতরাং যে সুবিধাজনক ছিল। দৃশ্যত [^.],
সু-সমর্থিত অবস্থায়, বহনযোগ্য নয় এবং আপনাকে !bang.
স্টিফেনের মন্তব্যটিতে আমি খুঁজে পেয়েছি use
যাইহোক, কেবল লুকানো ফাইলগুলিতে টানাই যথেষ্ট ছিল না, স্পষ্টতই। set
আক্ষরিক জন্য অবস্থানের অনুসন্ধান এড়ানোর জন্য আমাকে দু'বার করতে হবে $glob
। তবুও, এটি মোটেও কার্য সম্পাদনকে প্রভাবিত করে বলে মনে হচ্ছে না এবং এটি নির্ভরযোগ্যভাবে ডিরেক্টরিতে প্রতিটি ফাইল যুক্ত করে।