Bir klasördeki günlük dosya sayısını sayma


11

Klasördeki tüm dosyaların sayısını bulabilirim ama oldukça fazla sayıda var.

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

Her gün dosya sayısı nasıl bulunur?

Sonuç, şöyle bir şey olmalı:

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

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

Soldaki sayılar nedir? 109294ve109294
Sergiy Kolodyazhnyy

1
Sry, Günlük dosya sayısı.
tasmaniski

Yanıtlar:


21

Bunu, yalnızca değiştirme zamanlarını istenen biçimde yazdırmak için printfeylemini findkullanarak sortve sonra ve kullanarak yapabilirsiniz uniq:

find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
  • -printf '%TY-%Tm-%Td\n'dosyaların değiştirme zamanını, örneğin 2015-05-23formatta yazdırır

  • sortçıktıyı sıralar ve uniq -ctarihe göre sayımı yapar

Misal:

~/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
Not: bunlar Gnuplot ile grafiksel olarak görüntülenebilirfind . -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

İlginç bir yol ama işe yaramıyor. Bir grafik var ama veri yok ...
tasmaniski

4

İşte find+ ile bir çözümawk

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

Esasen ne olacağı, tüm normal dosyaları bulmamız ve %Tbiçiminde belirtildiği şekilde değişiklik zamanlarını yazdırmamız ve ardından awkdevralınması ve ilişkilendirilmiş diziler kullanarak her satırı saymasıdır. END{}deyim kullanımları fordöngü (tarih + sayımı olan) ilişkili dizideki tüm öğeleri geçmesi ve tuşu + dizi [anahtar] içeriğini yazdırmak için.

sortÇıktıyı düzenlemek için, özellikle sort -k 1sütun 1'e (tarih olan) dayalı olarak kullanmak isteyebilirsiniz , ancak bu isteğe bağlıdır. Ayrıca yalnızca geçerli klasördeki-maxdepth 1 dosyaları kontrol eder . Alt dizinlerdeki dosyaları da bulmak istiyorsanız, -maxdepth 1parçayı kaldırın .

Örnek çıktı

$ 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

Bu |sort | uniq -c, özellikle çok sayıda dosya ve küçük bir ish farklı gün kümesiyle sürümden daha hızlı çalışabilir . Sayımlara tek adımda daraltılması saymadan önce çok sayıda kopyayı sıralamayı önler.
Peter Cordes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.