क्या मुझे महीने तक एक `डु` समूहीकृत किया जा सकता है?


14

मेरे पास एक निर्देशिका है जिसमें बहुत सारे फोटो हैं। विशेष रूप से, du -sh --apparent-size /path/to/myfolderमुझे 331G देता है। जो माहान है। लेकिन अब मैं महीने के हिसाब से समूहीकृत एक सूची प्राप्त करना चाहता हूं, जैसे कुछ इस तरह:

2016-01   20MB
2016-02  520MB
2016-03  312MB
...

वहाँ linux buildins के साथ ऐसा करने के लिए एक उचित (उचित) तरीका है, या क्या मुझे इसे करने के लिए अपनी खुद की पायथन उपयोगिता लिखनी चाहिए?


1
लिनक्स में बिलिन नहीं है , यह एक ऑपरेटिंग सिस्टम कर्नेल है। क्या आप इसके बजाय कुछ लिनक्स आधारित ऑपरेटिंग सिस्टम (जैसे डेबियन, फेडोरा, क्रोमओएस ...) में डिफ़ॉल्ट रूप से पाए जाने वाले कमांड्स के साथ हैं ?
स्टीफन चेज़लस

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

1
@WayneWerner दूसरे शब्दों में, आपका अर्थ है GNU / Linux, जिसमें Bash, Coreutils और GNU ऑपरेटिंग वातावरण के अन्य मुख्य घटक शामिल हैं। #rmswasright
डेमियन येरिक

जवाबों:


23

लिनक्स पर, कोशिश करें:

find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort

यह काम किस प्रकार करता है

  • find /my/path

    यह / मेरे / पथ में फ़ाइलों की तलाश करता है।

  • -maxdepth 1

    यह findउपनिर्देशिका में नहीं देखने के लिए कहता है । (यदि आप एक पुनरावर्ती खोज चाहते हैं, तो इस विकल्प को छोड़ दें।)

  • -type f

    यह findखोज को नियमित फ़ाइलों तक सीमित करने के लिए कहता है।

  • -printf '%TY-%Tm %s\n'

    यह findप्रत्येक फ़ाइल के लिए बाइट्स में आकार के बाद वर्ष-महीने का प्रिंट आउट करने के लिए कहता है।

    चूंकि हमारे पास उनके लिए कोई उपयोग नहीं है, इसलिए मिली फ़ाइलों के नाम मुद्रित नहीं हैं।

  • b[$1]+=$2

    मिली प्रत्येक फ़ाइल के लिए, हम कॉलम 2 से मिली इसकी बाइट की गिनती को जोड़ते हैं, जो उस वर्ष-महीने के संयोजन को सहयोगी सरणी में गिनता है b

  • END{for (date in b) print date, b[date]}

    हमारे द्वारा सभी आउटपुट संसाधित करने के बाद find, हम परिणाम प्रिंट करते हैं।

  • sort

    यह दिनांक क्रम में परिणामों को क्रमबद्ध करता है।

एकाधिक लाइन संस्करण

उन लोगों के लिए जो अपने कोड को कई लाइनों में फैलाते हैं:

find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' |
  awk '
    {
      b[$1]+=$2
    }

    END{
      for (date in b)
        print date, b[date]
    }
    ' | sort

उदाहरण

आइए इन फाइलों के साथ एक निर्देशिका पर विचार करें:

$ ls -l
total 27816
-rw------- 1 john1024 john1024 2459173 Nov 23  2015 img100.jpg
-rw------- 1 john1024 john1024 3479750 Nov 23  2015 img101.jpg
-rw------- 1 john1024 john1024 4028939 Nov 23  2015 img102.jpg
-rw------- 1 john1024 john1024 2928519 Jul 30 18:55 img103.jpg
-rw------- 1 john1024 john1024 2948294 Jul 30 18:55 img104.jpg
-rw------- 1 john1024 john1024 3177583 Aug  1 16:56 img105.jpg
-rw-rw---- 1 john1024 john1024 3111737 Apr 18  2016 img106.jpg
-rw-rw---- 1 john1024 john1024 1441310 Apr 18  2016 img107.jpg
-rw-rw---- 1 john1024 john1024 2430158 Apr 25 16:26 img108.jpg
-rw-rw---- 1 john1024 john1024 2424504 Apr 25 16:26 img109.jpg

हमारी कमांड से आउटपुट है:

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort
2015-11 9967862
2016-04 9407709
2016-07 5876813
2016-08 3177583

शोधन

यदि हम बाइट्स के बजाय mebibytes (MiB) में आउटपुट चाहते हैं, तो हम यूनिट्स को इस तरह परिवर्तित कर सकते हैं:

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]/1024**2, "MiB"}' | sort
2015-11 9.50609 MiB
2016-04 8.97189 MiB
2016-07 5.60457 MiB
2016-08 3.03038 MiB

हम आउटपुट स्वरूप का उपयोग करके अभी भी अधिक नियंत्रण प्राप्त कर सकते हैं printf। यहां, दशमलव बिंदु के बाद सिर्फ एक अंक रखने के लिए, हम आकार को इसके साथ बनाते हैं %5.1f:

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) printf "%s %5.1f MiB\n", date, b[date]/1024**2}' | sort
2015-11   9.5 MiB
2016-04   9.0 MiB
2016-07   5.6 MiB
2016-08   3.0 MiB

यह शानदार है। आप किसी भी जाग ट्यूटोरियल की सिफारिश कर सकते हैं? मैंने अभी तक एक नहीं पाया है जिसने मेरी आँखों को लगभग बीस सेकंड के भीतर पार नहीं किया है।
hBy2Py

1
@ hBy2Py मेरा पसंदीदा परिचय जागृत करने के लिए, भले ही अब यह थोड़ा दिनांकित हो, Grymoire ट्यूटोरियल है
जॉन 1024

मैं दूसरे स्तंभ में अंतरिक्ष पैडिंग जोड़ने के printf "%s %9d\n", date, b[date]बजाय का उपयोग करने का सुझाव देता print date, b[date]
हूं

@rav_kr अच्छा विचार है। मैंने सिर्फ एक उदाहरण के साथ उत्तर को अपडेट किया है जो उपयोग करता है printf
जॉन 1024

FWIW अगर आपके पास है findकि -maxdepthआप का समर्थन करता है कि शायद है [g]awkकि समर्थन करता हैPROC_INFO["sorted_in"]="@ind_str_asc"
dave_thompson_085
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.