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