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


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.