Hitung jumlah file dalam folder per hari

11

Saya dapat menemukan jumlah semua file dalam folder tetapi saya mendapat jumlah yang cukup besar.

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

Bagaimana menemukan jumlah file setiap hari?

Jadi, hasilnya harus seperti:

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

109294 2016-06-27
101555 2016-06-26
88123  2016-06-25 
... etc. 
tasmaniski
sumber
Dan berapa angka di sebelah kiri? 109294dan109294
Sergiy Kolodyazhnyy
1
Sry, Itu adalah jumlah file per hari.
tasmaniski

Jawaban:

21

Anda dapat melakukan ini menggunakan printftindakan finduntuk hanya mencetak waktu modifikasi dalam format yang diinginkan, dan kemudian menggunakan sortdan uniq:

find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
  • -printf '%TY-%Tm-%Td\n'mencetak waktu modifikasi file dalam 2015-05-23format misalnya

  • sortmengurutkan output dan uniq -cmenghitung berdasarkan tanggal

Contoh:

~/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
heemayl
sumber
2
NB: ini dapat dilihat secara grafis dengan Gnuplot menggunakanfind . -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
Cara yang menarik, tetapi tidak berhasil. Saya mendapat gambar tetapi tanpa data ...
tasmaniski
4

Inilah solusi dengan 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]   }'

Pada dasarnya yang terjadi adalah kami menemukan semua file biasa dan mencetak waktu modifikasinya seperti yang ditentukan oleh %Tformat, dan kemudian awkmengambil alih, dan menghitung setiap baris menggunakan associate array. yang END{}menggunakan pernyataan forloop untuk pergi melalui semua elemen dalam array terkait, dan mencetak kunci + array [kunci] isi (yang merupakan tanggal + count).

Anda mungkin ingin menggunakan sortuntuk mengatur output, terutama sort -k 1berdasarkan kolom 1 (yang tanggal), tetapi itu opsional. Juga -maxdepth 1akan memeriksa file hanya di folder saat ini . Jika Anda ingin mencari file di subdirektori juga, hapus -maxdepth 1bagian.

Output sampel

$ 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
Sergiy Kolodyazhnyy
sumber
Ini mungkin berjalan lebih cepat daripada |sort | uniq -cversi, terutama dengan jumlah file yang sangat besar dan satu set hari yang berbeda. Runtuh ke penghitungan dalam satu langkah menghindari menyortir sejumlah besar duplikat sebelum menghitung.
Peter Cordes