นับจำนวนไฟล์ในโฟลเดอร์ต่อวัน


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
Sergiy Kolodyazhnyy

1
Sry นั่นคือจำนวนไฟล์ต่อวัน
tasmaniski

คำตอบ:


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
หมายเหตุ: เหล่านี้สามารถดูได้กราฟิกกับ Gnuplot โดยใช้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"
user1717828

วิธีที่น่าสนใจ แต่ไม่ได้ผล ผมได้กราฟิก แต่ไม่มีข้อมูล ...
tasmaniski

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เวอร์ชันโดยเฉพาะอย่างยิ่งกับไฟล์จำนวนมากและชุดเล็ก ๆ ของวันที่แตกต่างกัน การยุบลงเพื่อนับในขั้นตอนเดียวหลีกเลี่ยงการเรียงลำดับรายการซ้ำจำนวนมากก่อนนับ
ปีเตอร์กอร์เดส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.