তাদের প্রথম স্তরের সর্বাধিক ফাইল / ডিরেক্টরি সম্বলিত শীর্ষ 50 ডিরেক্টরিগুলি সন্ধান করুন?


21

findসর্বাধিক সংখ্যক ফাইল ধারণকারী ডিরেক্টরিগুলির তালিকা তৈরি করতে আমি কীভাবে ব্যবহার করতে পারি । আমি তালিকাটি সর্বোচ্চ থেকে সর্বনিম্ন হতে চাই। আমি কেবল তালিকাটি 1 স্তরের গভীরতর দিকে যেতে চাই এবং আমি সাধারণত আমার ফাইল সিস্টেমের উপরে থেকে এই কমান্ডটি চালাতাম, অর্থাত্‍ /


বিভিন্ন প্রশ্ন (আসলে একই কিন্তু অন্যরকম জিজ্ঞাসা করা হয়েছিল), তবে উত্তরগুলি কি আপনার প্রশ্নের সমাধান করবে না? unix.stackexchange.com/questions/117093/…
প্যাট্রিক

এছাড়াও সম্পর্কিত - স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / 15216370/… । আমি আয়নড প্রশ্নের বাইরে আমার মূল উত্তরটি ভিত্তি করে দেখলাম, যদিও আমার ধারণা আমার দৃষ্টিভঙ্গি সেগুলির চেয়ে কিছু উন্নতি প্রস্তাব করে।
গ্রামীণ

@ পেট্রিক - এটি গ্র্যামেস এ কেবল বাড়ির একটি ভারী কিউ True
slm

@ এসএলএম তবে কেন এটি নকল নয় তা সত্যিই আমি পাই না। তাঁর উত্তরটি অন্য একটি প্রশ্নের উত্তরের কেবল একটি ব্যাখ্যার বলে মনে হচ্ছে। সুতরাং এখন আমরা একই জিনিস জন্য 3 টি প্রশ্ন আছে। আমি মনে করি আমার লিঙ্কের উত্তরটিও পরিষ্কার। পাওয়া প্রতিটি ডিরেক্টরিতে শেল চালু করা কেবল নোংরা অনুভব করে।
প্যাট্রিক

1
@ পেট্রিক, আমি উত্তরটি পুনরায় তৈরি করেছি যাতে জিএনইউ সমাধানটি প্রতিটি ডিরেক্টরিতে নতুন শেল শুরু না করে। যদিও দ্রষ্টব্য যে কোনও ফাইলের নাম বহনযোগ্যভাবে মোকাবেলার জন্য এটি স্ট্যান্ডার্ড সমাধান।
গ্রামীণ

উত্তর:


17

জিএনইউ সরঞ্জামগুলি ব্যবহার করে:

find / -xdev -type d -print0 |
  while IFS= read -d '' dir; do
    echo "$(find "$dir" -maxdepth 1 -print0 | grep -zc .) $dir"
  done |
  sort -rn |
  head -50

এই দুটি ব্যবহার findকমান্ড। প্রথমে ডিরেক্টরিগুলি খুঁজে পায় এবং সেগুলিকে একটি whileলুপে পাইপ করে প্রতিটি ডিরেক্টরিতে পরবর্তী অনুসন্ধান চালায়। দ্বিতীয়টি সমস্ত স্তরের ফাইলগুলি / ডিরেক্টরিগুলি প্রথম স্তরের তালিকাভুক্ত করে তাদের তালিকাভুক্ত grepকরে। grepপারবেন -print0দ্বিতীয় খোঁজ সঙ্গে ব্যবহার করা থেকে wcএকটি নেই -zসমতুল্য। এটি একটি নতুন লাইনযুক্ত ফাইলের নামগুলি দুবার গণনা করা থেকে বিরত রাখে (যদিও ব্যবহার করার ক্ষেত্রে wcএবং কোনওটি -print0খুব বেশি পার্থক্য করে না)।

দ্বিতীয়টির findফলাফলটিকে যুক্তিযুক্ত স্থানে স্থাপন করা হয় echoএবং ডিরেক্টরিটির নামটি একই লাইনে সহজেই স্থাপন করা যায় ( $(..)কনস্ট্রাক্টটি স্বয়ংক্রিয়ভাবে শেষের দিকে নতুন লাইনটি ছাঁটাই করে grep)। লাইনের পরে সংখ্যা অনুসারে বাছাই করা হয় এবং 50 টির সাথে সবচেয়ে বড় সংখ্যা দেখানো হয় head

নোট করুন যে এটিতে মাউন্ট পয়েন্টগুলির শীর্ষ স্তরের ডিরেক্টরিগুলিও অন্তর্ভুক্ত থাকবে। এর কাছাকাছি যাওয়ার একটি সহজ উপায় হ'ল বাইন্ড মাউন্ট ব্যবহার করা এবং তারপরে মাউন্টটির ডিরেক্টরি ব্যবহার করা। এটা করতে:

sudo mount --bind / /mnt

একটি আরও বহনযোগ্য সমাধান প্রতিটি ডিরেক্টরিতে আলাদা শেল উদাহরণ ব্যবহার করে (এখানেও উত্তর দেওয়া হয়েছে ):

find / -xdev -type d -exec sh -c '
  echo "$(find "$0" | grep "^$0/[^/]*$" | wc -l) $0"' {} \; |
  sort -rn |
  head -50

নমুনা আউটপুট:

9225 /var/lib/dpkg/info
6322 /usr/share/qt4/doc/html
4927 /usr/share/man/man3
2301 /usr/share/man/man1
2097 /usr/share/doc
2097 /usr/bin
1863 /usr/lib/x86_64-linux-gnu
1679 /var/cache/apt/archives
1628 /usr/share/qt4/doc/src/images
1614 /usr/share/qt4/doc/html/images
1308 /usr/share/scilab/modules/overloading/macros
1083 /usr/src/linux-headers-3.13-1-common/include/linux
1071 /usr/src/linux-headers-3.13-1-amd64/include/config
847 /usr/include/qt4/QtGui
774 /usr/include/qt4/Qt
709 /usr/share/man/man8
616 /usr/lib
611 /usr/share/icons/oxygen/32x32/actions
608 /usr/share/icons/oxygen/22x22/actions
598 /usr/share/icons/oxygen/16x16/actions
579 /usr/share/bash-completion/completions
574 /usr/share/icons/oxygen/48x48/actions
570 /usr/share/vim/vim74/syntax
546 /usr/share/scilab/modules/m2sci/macros/sci_files
531 /usr/lib/i386-linux-gnu/wine/wine
530 /usr/lib/i386-linux-gnu/wine/wine/fakedlls
496 /etc/ssl/certs
457 /usr/share/mime/application
454 /usr/share/man/man2
450 /usr/include/qt4/QtCore
443 /usr/lib/python2.7
419 /usr/src/linux-headers-3.13-1-common/include/uapi/linux
413 /usr/share/fonts/X11/misc
413 /usr/include/linux
375 /usr/share/man/man5
374 /usr/share/lintian/overrides
372 /usr/share/cmake-2.8/Modules
370 /usr/share/fonts/X11/75dpi
370 /usr/share/fonts/X11/100dpi
356 /usr/share/icons/gnome/24x24/actions
356 /usr/share/icons/gnome/22x22/actions
356 /usr/share/icons/gnome/16x16/actions
353 /usr/share/icons/gnome/48x48/actions
353 /usr/share/icons/gnome/32x32/actions
341 /usr/lib/ghc/ghc-7.6.3
326 /usr/sbin
324 /usr/share/scilab/modules/compatibility_functions/macros
324 /usr/share/scilab/modules/cacsd/macros
320 /usr/share/terminfo/a
319 /usr/share/i18n/locales

11

আপডেট: আমি নীচের সমস্তগুলি করেছি, যা দুর্দান্ত, তবে আমি ইনোড ব্যবহারের মাধ্যমে ডিরেক্টরি বাছাই করার আরও ভাল উপায় নিয়ে হাজির হয়েছি:

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। তবুও, এটি মোটেও কার্য সম্পাদনকে প্রভাবিত করে বলে মনে হচ্ছে না এবং এটি নির্ভরযোগ্যভাবে ডিরেক্টরিতে প্রতিটি ফাইল যুক্ত করে।


@ গ্রামীম আপনি জানেন, আমাদের সমাধানগুলির কোনওটিই আসলে ইনডগুলি পরিচালনা করছে না। আমরা তালিকাভুক্ত সেই ফাইলগুলির অনেকগুলি সম্ভবত একে অপরের সাথে যুক্ত। আমি মনে করি আমি এটি দিয়ে করতে পারি ls -iএবং ... আমার ধারণা ... সম্ভবত grep... সম্ভবত - ভাল, আপনি -xdev,কোনটি শুরু হিসাবে ব্যবহার করছেন ... uniqএবং sort?
মাইকসার্ভ

আপনি কোন সংস্করণ duচালাচ্ছেন? আমার duকোন --inodesবিকল্প নেই।
প্যাট্রিক 13

@ প্যাট্রিক - সম্ভবত আপডেট করতে চান - তবে আমি পোস্টটি আপডেট করেছি।
মাইক্রজারভ

এটি একটি রক্তক্ষরণ প্রান্ত বৈশিষ্ট্য :-) আমি 8.21 চালিয়ে যাচ্ছি। দেখে মনে হচ্ছে এটি 2013-07-27 যোগ হয়েছে: git.savannah.gnu.org/gitweb/…
প্যাট্রিক

এছাড়াও, যদি আপনি আপত্তি না করেন, আপনি কি এই প্রশ্নটিতে পোস্ট করতে পারেন ? এটি খুব পোর্টেবল না হওয়ায় আমি এটি গ্রহণ করব বলে আমি মনে করি না, তবে আমি উত্সাহিত করব, এবং প্রশ্নের আরও একটি সমাধান পেয়ে ভাল লাগবে।
প্যাট্রিক 13

1

কেডিআরস্ট্যাট জাতীয় কিছু ব্যবহার করবেন না যদিও এটি মূলত কে-ডি-র জন্য রচিত হয়েছিল তবে এটি জিনোমের সাথে ঠিকঠাকভাবে কাজ করে এটি আপনাকে জিওআই-তে ফাইল / দির সংখ্যা এবং সম্পর্কিত ব্যবহারের সেরা দৃশ্য দেয়


1
কমান্ড লাইন পদ্ধতিটি খুঁজছি।
slm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.