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. 

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.