du जो आकार के बजाय फ़ाइलों / निर्देशिकाओं की संख्या की गणना करता है


13

मैं एक हार्ड ड्राइव को साफ करने की कोशिश कर रहा हूं, जिस पर सभी प्रकार की बकवास वर्षों से जमा हुई है। duडिस्क उपयोग को कम करने में मदद की है, लेकिन कुल आकार के कारण पूरी तरह से अभी भी अनजाने में नहीं है, लेकिन कुल फ़ाइलों और निर्देशिकाओं की सरासर संख्या के कारण।

वहाँ एक तरह से मैं कुछ कर सकते हैं du, लेकिन फ़ाइल आकार की गिनती नहीं है, बल्कि फाइलों और निर्देशिकाओं की संख्या है? उदाहरण के लिए: एक फ़ाइल 1 है, और एक निर्देशिका इसके अंदर फ़ाइलों / निर्देशिकाओं की पुनरावर्ती संख्या है + 1।

संपादित करें: मुझे अधिक स्पष्ट होना चाहिए था। मैं न केवल में फ़ाइलें / निर्देशिका की कुल संख्या जानना चाहते हैं /, लेकिन यह भी में /home, /usrआदि, और उनके उप-निर्देशिकाओं के, रिकर्सिवली, जैसे duआकार के लिए करता है।


2
लगता है कि आप यहां उत्तरों के थोड़े संशोधित संस्करण की तरह देख रहे होंगे, यहां superuser.com/questions/198817/…
James

जवाबों:


11

मैंने du --inodesउपयोगी पाया है, लेकिन मुझे यकीन नहीं है कि इसके किस संस्करण की duआवश्यकता है। Ubuntu 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 टेस्टफाइल
  • कैट टेस्टफाइल | स्वागत

पहला विकल्प wc को एक फाइल खोलने देता है और उस फाइल में लाइनों, शब्दों और वर्णों की संख्या की गणना करता है। दूसरा विकल्प वही करता है लेकिन फ़ाइल नाम के बिना यह स्टड से पढ़ता है।


आप एक पाइप के साथ कमांड जोड़ सकते हैं |। पहली कमांड से आउटपुट दूसरी कमांड के इनपुट पर पाइप किया जाएगा। इस प्रकार find /path/to/search -ls | wc -lसभी फाइलों और निर्देशिका को सूचीबद्ध करने के लिए खोज का उपयोग करता है और आउटपुट को wc में फीड करता है। Wc तब लाइनों की संख्या गिनता है।

(एक अन्य विकल्प `ls | wc 'रहा होगा, लेकिन यह बहुत अधिक लचीला और सीखने का एक अच्छा साधन है)।


[टिप्पणी के बाद संपादित करें]

यह खोज और निष्पादन को संयोजित करने के लिए उपयोगी हो सकता है।

ईजी find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;सभी निर्देशिकाओं को /, बार में सूचीबद्ध करेगा, जिन्हें आप खोजना नहीं चाहते हैं। हम उनमें से प्रत्येक में प्रति फ़ोल्डर में फ़ाइलों की राशि उपज, पिछले कमांड को ट्रिगर कर सकते हैं।

तथापि:

  1. यह GNU विशिष्ट एक्सटेंशन -maxdepth का उपयोग करता है।
    यह लिनक्स पर काम करेगा, लेकिन किसी भी यूनिक्स-एक जैसे पर नहीं।
  2. मुझे संदेह है कि आप वास्तव में प्रत्येक और हर उपखंड के लिए एक संख्या के लिए फाइल चाहते हैं।

क्षमा करें, हालांकि केवल एक स्तर गहरा नहीं है, लेकिन सभी स्तरों के लिए (यही मेरे संपादन में "पुनरावर्ती" से मेरा मतलब है)।
जेसी

निष्पादन की गूंज के बजाय आप एक खोज ट्रिगर | प्रत्येक dir के लिए wc। मुझे पता है कि यह संभव है, लेकिन मैं यह नहीं जान सकता कि आज कैसा है। मुझे लगता है कि मैं किसी भी तरह एक ही गलती करता रहता हूं। * कॉफी बनाने के लिए जाता है।
हेन्नेस

4

निम्न PHP स्क्रिप्ट चाल है।

#!/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


क्यों यह स्वीकार किए जाते हैं जवाब है ?! आप मान रहे हैं कि php मशीन पर है, जो हमेशा ऐसा नहीं होता है। स्क्रिप्ट प्रलेखित और विशिष्ट नहीं है। जबकि एसई पर अपने स्वयं के प्रश्न का उत्तर देना ठीक है, यह उत्तर आपके स्वयं के प्रश्न का उत्तर भी नहीं देता है ; या आपने उस प्रश्न को नहीं पूछा जो आपके मन में था जब समस्या उत्पन्न हुई ... दुर्भाग्य से मैं इसे कम नहीं कर सकता, मुझे कुछ बात करनी है ... फिर भी, बुरा जवाब!
user1810087

मैं उस भाषा के लिए दुभाषिया स्थापित किए बिना किसी भी भाषा में स्क्रिप्ट नहीं लिख सकता । स्क्रिप्ट प्रत्येक निर्देशिका के नीचे फ़ाइलों और निर्देशिकाओं की कुल संख्या को पुनरावर्ती रूप से प्रिंट करती है। तो यह duकि बस संक्षेप आकार के बजाय मायने रखता है, जो वास्तव में मूल प्रश्न पूछा गया है।
जेसी

2

ncdu इसके लिए बहुत अच्छा है!

मैन पेज से, आप प्रति डायरेक्टरी और क्रम के अनुसार काउंट्स भी दिखा सकते हैं:

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

उदाहरण के लिए:

ncdu आउटपुट


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
मेरे पास .fluxbox / में क्यों है? : D
Dрослав Рахматуллин

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.