प्रति दिन एक फ़ोल्डर में फ़ाइलों की संख्या की गणना करें


11

मुझे फ़ोल्डर में सभी फ़ाइलों की संख्या मिल सकती है लेकिन मुझे बहुत बड़ी संख्या मिली है।

find . -type f | wc -l      #find number of files in DIR
ls -lrt                     #list all files order by date  

फाइलों की संख्या का पता कैसे लगाएं?

तो, परिणाम कुछ इस तरह होना चाहिए:

# left number is number of files and right is one day.

109294 2016-06-27
101555 2016-06-26
88123  2016-06-25 
... etc. 

और बाईं ओर संख्या क्या है? 109294और109294
सेर्गेई कोलोडियाज़नी

1
Sry, यह प्रति दिन फ़ाइलों की संख्या है।
तस्मानीस्की

जवाबों:


21

आप वांछित प्रारूप में केवल संशोधन के समय को प्रिंट करने की printfक्रिया का उपयोग करके ऐसा कर सकते हैं find, और फिर उपयोग कर सकते हैं sortऔर uniq:

find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
  • -printf '%TY-%Tm-%Td\n'जैसे 2015-05-23प्रारूप में फ़ाइलों के संशोधन समय प्रिंट

  • sortआउटपुट uniq -cको क्रमबद्ध करता है और तिथि के अनुसार गणना करता है

उदाहरण:

~/foobar% find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
      3 2004-06-29
      1 2004-08-23
      1 2004-09-15
      1 2004-09-18
      1 2005-07-24
      1 2006-02-05
      2 2008-06-25
      3 2008-12-31
      1 2009-03-13
      1 2009-04-30
      1 2010-04-04
      2 2010-09-01
      8 2011-07-13
     15 2011-08-27
      3 2011-11-03
      3 2014-10-08

2
नायब: इन्हें find . -type f -printf '%TY-%Tm-%Td\n' 2</dev/null | sort | uniq -c | tail -n +2 | gnuplot -p -e "set xdata time; set timefmt \"%Y-%m-%d\";set xtics rotate; plot '-' using 2:1 with impulses"
Gnuplot के

दिलचस्प तरीका है, लेकिन यह काम नहीं करता है। मुझे एक ग्राफिक मिला है, लेकिन कोई डेटा नहीं है ...
तस्मानुस्की

4

यहाँ के साथ एक समाधान है find+awk

find . -maxdepth 1 -type f -printf '%TY-%Tm-%Td\n' | awk '{array[$0]+=1}END{ for(val in array) print val" "array[val]   }'

अनिवार्य रूप से क्या होता है कि हम सभी नियमित फाइलें ढूंढते हैं और %Tप्रारूप द्वारा निर्दिष्ट उनके संशोधन समय को प्रिंट करते हैं , और फिर awkएसोसिएट एरे का उपयोग करके प्रत्येक पंक्ति को गिनते हैं। END{}बयान का उपयोग करता है forपाश संबद्ध सरणी में सभी तत्वों के माध्यम से जाना है, और कुंजी + सरणी [कुंजी] सामग्री मुद्रित (जो तिथि + गिनती है)।

आप sortविशेष रूप sort -k 1से कॉलम 1 (जो दिनांक) पर आधारित है , आउटपुट को व्यवस्थित करने के लिए उपयोग करना चाह सकते हैं , लेकिन यह वैकल्पिक है। इसके अलावा केवल वर्तमान फ़ोल्डर में-maxdepth 1 फ़ाइलों के लिए जाँच करेगा । यदि आप उपनिर्देशिकाओं में भी फाइल ढूंढना चाहते हैं, तो भाग को हटा दें ।-maxdepth 1

नमूना उत्पादन

$ find . -maxdepth 1 -type f -printf '%TY-%Tm-%Td\n' | awk '{array[$0]+=1}END{ for(val in array) print val" "array[val]   }'

2015-09-29 1
2016-04-06 2
2016-04-07 10
2016-04-08 2
2015-11-05 2
2016-04-22 2
2016-04-23 6
2016-04-24 1
2015-11-21 2
2015-11-22 2

यह |sort | uniq -cसंस्करण की तुलना में तेजी से चल सकता है , विशेष रूप से बहुत बड़ी संख्या में फाइलों और विभिन्न दिनों के छोटे-से-सेट के साथ। मतगणना से पहले एक कदम में गिनती के लिए नीचे गिरने से बड़ी संख्या में डुप्लिकेट की छंटनी से बचा जाता है।
पीटर कॉर्डेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.