du যা আকারের চেয়ে ফাইল / ডিরেক্টরিগুলির সংখ্যা গণনা করে


13

আমি একটি হার্ড ড্রাইভ পরিষ্কার করার চেষ্টা করছি যা বছরের পর বছর ধরে এটির মধ্যে সমস্ত ধরণের বাজেতা রয়েছে। duডিস্কের ব্যবহার হ্রাস করতে সহায়তা করেছে, তবে পুরো জিনিসটি এখনও সম্পূর্ণ আকারের কারণে অকারণে নয়, মোটে ফাইল এবং ডিরেক্টরিগুলির নিছক সংখ্যার কারণে।

duফাইলের আকার গণনা না করে বরং ফাইল এবং ডিরেক্টরিগুলির সংখ্যার মতো আমি কী কিছু করতে পারি ? উদাহরণস্বরূপ: একটি ফাইল 1 এবং একটি ডিরেক্টরি হ'ল এটির 1 + এর অভ্যন্তরে পুনরাবৃত্ত সংখ্যক ফাইল / ডিরেক্টরি।

সম্পাদনা: আমার আরও পরিষ্কার হওয়া উচিত ছিল। আমি কেবল ফাইল / ডিরেক্টরিগুলির মোট সংখ্যাটিই জানতে চাই না /, তবে ইন /home, /usrইত্যাদি এবং তাদের উপ-ডিরেক্টরিগুলিতেও পুনরাবৃত্তভাবে duআকারের মতোই জানি ।


2
ভাবুন আপনি এখানে উত্তরের সামান্য পরিবর্তিত সংস্করণের মতো কিছু খুঁজছেন সম্ভবত সুপারুজার.কোভিশনস
জেমস

উত্তর:


11

আমি du --inodesদরকারী খুঁজে পেয়েছি , তবে duএটির কোন সংস্করণের প্রয়োজন তা আমি নিশ্চিত নই । উবুন্টু 17.10 এ, নিম্নলিখিত কাজ করে:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

সংযুক্ত ইনোডের | sort -nrসংখ্যা অনুসারে অবতরণকে সাজানোর সাথে একত্রিত করুন ।


1
এটি গ্রহণযোগ্য উত্তরের চেয়ে অনেক বেশি দেখতে চাই।
শ্রীধর সারনোবাত

8

সবচেয়ে সহজ উপায় বলে মনে হচ্ছে find /path/to/search -ls | wc -l

সমস্ত ফাইল এবং ফোল্ডার সন্ধানের জন্য হাঁটা ব্যবহার করা হয়।
-lsসমস্ত নাম তালিকা (মুদ্রণ) করতে। এটি একটি ডিফল্ট এবং আপনি এটি ছেড়ে দিলে এটি এখনও প্রায় সমস্ত সিস্টেমে একই রকম কাজ করবে। (প্রায়, যেহেতু কারওর মধ্যে পৃথক ডিফল্ট থাকতে পারে)। যদিও এটি স্পষ্টভাবে ব্যবহার করা ভাল অভ্যাস।

আপনি যদি কেবলমাত্র find /path/to/search -lsঅংশটি ব্যবহার করেন এটি আপনার স্ক্রিনে সমস্ত ফাইল এবং ডিরেক্টরি মুদ্রণ করবে।


wcশব্দ গণনা। -lবিকল্প বলা হয়েছে যে সব লাইন সংখ্যা গণনা করা হয়।

আপনি এটি বিভিন্ন উপায়ে ব্যবহার করতে পারেন, যেমন

  • ডাব্লুসি টেস্টফিল
  • বিড়াল টেস্টফিল | wc-

প্রথম বিকল্পটি ডাব্লুসিটি একটি ফাইল খুলতে এবং সেই ফাইলটিতে লাইন, শব্দ এবং অক্ষরের সংখ্যা গণনা করতে দেয়। দ্বিতীয় বিকল্পটি একই কাজ করে তবে ফাইল নাম ছাড়াই এটি স্টিডিন থেকে পড়ে।


আপনি পাইপের সাহায্যে আদেশগুলি একত্রিত করতে পারেন |। প্রথম কমান্ডের আউটপুট দ্বিতীয় কমান্ডের ইনপুটগুলিতে পাইপ করা হবে। এইভাবে find /path/to/search -ls | wc -lসমস্ত ফাইল এবং ডিরেক্টরি তালিকাবদ্ধ করতে ব্যবহার করে এবং ডাব্লিউসিকে আউটপুট ফিড করে। ডাব্লুসিটি তারপরে লাইনের সংখ্যা গণনা করে।

(অন্য একটি বিকল্প হ'ল `ls | wc 'হত, তবে এটি অনেক বেশি নমনীয় এবং শেখার একটি ভাল সরঞ্জাম find


[মন্তব্যের পরে সম্পাদনা করুন]

এটি অনুসন্ধান এবং নির্বাহকের একত্রিত করতে কার্যকর হতে পারে।

যেমন find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;/, তে সমস্ত ডিরেক্টরি তালিকাভুক্ত করে যা কিছু আপনি সন্ধান করতে চান না bar আমরা প্রতিটিতে পূর্ববর্তী কমান্ডটি ট্রিগার করতে পারি, / এ ফোল্ডারে প্রতি ফাইলের যোগফল।

যাহোক:

  1. এটি GNU নির্দিষ্ট এক্সটেনশন -ম্যাক্সডেপথ ব্যবহার করে।
    এটি লিনাক্সে কাজ করবে, তবে কেবল কোনও ইউনিক্স-এ-একইভাবে নয়।
  2. আমার সন্দেহ হয় আপনি সম্ভবত প্রতিটি সাবডিরের জন্য একটি ফাইলের ফাইল চাইবেন।

দুঃখিত, যদিও মাত্র এক স্তর গভীর নয়, তবে সমস্ত স্তরের জন্য (এটি আমার সম্পাদনায় "পুনরাবৃত্তভাবে" বলতে চাই)।
জেসি

এক্সেকের প্রতিধ্বনি পরিবর্তে আপনি একটি অনুসন্ধান ট্রিগার করুন প্রতিটি dir জন্য ডাব্লুসি। আমি জানি এটি সম্ভব, তবে আজ কীভাবে তা আবিষ্কার করতে পারি বলে মনে হয় না। আমার ধারণা আমি কোনওভাবে একই ভুল করে চলেছি। * কফি খাওয়ার জন্য যায়।
হেনেস

4

নিম্নলিখিত পিএইচপি স্ক্রিপ্টটি কৌশলটি করে।

#!/usr/bin/php
<?php 

function do_scan($dir, $dev) {
  $total = 1;

  if (\filetype($dir) === 'dir' && \lstat($dir)['dev'] == $dev) {
    foreach (\scandir($dir) as $file) {
      if ($file !== '.' && $file !== '..') {
        $total += do_scan($dir . \DIRECTORY_SEPARATOR . $file, $dev);
      }
    }

    print "$total\t$dir\n";
  }

  return $total;
};

foreach (\array_slice($argv, 1) as $arg) {
  do_scan($arg, \lstat($arg)['dev']);
}

এটি একটি ফাইলে রাখুন (বলুন, " treesize"), chmod +xএটি দিয়ে এটি চালান ./treesize . | sort -rn | less


কেন এটি গৃহীত উত্তর ?! আপনি ধরে নিচ্ছেন যে পিএইচপি মেশিনে রয়েছে যা সবসময় হয় না। স্ক্রিপ্টটি নথিভুক্ত এবং নির্দিষ্টভাবে নয়। যদিও এটা ঠিক আছে দঃপূঃ আপনার নিজস্ব প্রশ্নের উত্তর দিতে, এই উত্তর এমনকি একটি উত্তর প্রদান করে না আপনার নিজের প্রশ্ন ; বা সমস্যাটি হওয়ার পরে আপনি যে প্রশ্নটি মনে রেখেছিলেন তা আপনি জিজ্ঞাসা করেননি ... দুর্ভাগ্যক্রমে আমি এটিকে হ্রাস করতে পারি না, আমার কিছুটা কথা বলতে হবে ... তবুও খারাপ উত্তর!
ব্যবহারকারী 1810087

আমি কোনও ভাষাতে স্ক্রিপ্টটি লিখতে পারছি না সেই ভাষাটির জন্য একজন অনুবাদককে ইনস্টল করা আছে ass স্ক্রিপ্ট প্রতিটি ডিরেক্টরি নীচে পুনরাবৃত্তভাবে মোট ফাইল এবং ডিরেক্টরি সংখ্যা প্রিন্ট করে। সুতরাং একটি duযা সংখ্যার পরিবর্তে আকারের পরিবর্তে গণনা করা হয় যা মূল প্রশ্নটি জিজ্ঞাসা করেছিল।
জেসি

2

এনসিডিইউ এর জন্য দুর্দান্ত!

ম্যান পৃষ্ঠা থেকে, আপনি প্রতিটি ডিরেক্টরি অনুসারে গণনা প্রদর্শন করতে পারেন এবং গণনা অনুসারেও অর্ডার করতে পারেন:

[...]
KEYS
       C   Order by number of items (press again for descending order)
[...]
       c   Toggle display of child item counts.

উদাহরণ স্বরূপ:

এনসিডিইউ আউটপুট


1

ডায়ারস এবং ফাইলগুলি পৃথক করে করা হয়েছে তা অনুসন্ধান করুন /। এই স্ক্রিপ্টটি আপনার মানদণ্ডগুলিকে গরম করে তবে একটি সম্পূর্ণ সমাধানকে অনুপ্রাণিত করে। আপনার অবস্থানগুলির সাথে আপনার ফাইলগুলি সূচিকাগুলি বিবেচনা করা উচিত।

geee: /R/tb/tmp
$ find  2>/dev/null | awk -F/ -f filez  | sort -n
files:  57
3       imagemagick
7       portage
10      colemak-1.0
25      minpro.com
42      monolith
80      QuadTree
117     themh
139     skyrim.stings
185     security-howto
292     ~t
329     skyrim
545     HISTORY
705     minpro.com-original
1499    transmission-2.77
23539   ugent-settings

>

$ cat filez
{
a[$2]++;     # $1= folder,  $2 = everything inside folder.
}

END {
        for (i in a) {
                if (a[i]==1) {files++;}
                else { printf "%d\t%s\n", a[i], i; }
        }
        print "files:\t" files
}

>

 $ time locate /  | awk -F/ -f /R/tb/tmp/filez  | sort -n
 files:  13
 2
 2       .fluxbox
 10      M
 11      BIN
 120     bin
 216     sbin
 234     boot
 374     R
 854     dev
 1351    lib
 2018    etc
 9274    media
 30321   opt
 56516   home
 93625   var
 222821  usr
 351367  mnt
 time: Real 0m17.4s  User 0m4.1s  System 0m3.1s

2
আমার / ফ্লুবক্সে কেন? : ডি
Ярослав

1

এখানে ইউনিক্স এবং লিনাক্সের কোনও পোস্ট দ্বারা অনুপ্রাণিত ব্যাশ ব্যবহার করার একটি সমাধান রয়েছে ।

find . -type d | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

যদি এমন কিছু ফোল্ডার থাকে যা আপনি বিবরণ দেখতে চান না, যেমন .git, আপনি সেগুলি তালিকা থেকে বাদ দিতে পারেন grep

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.