लिनक्स पर, कोशिश करें:
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