Policz liczbę plików w folderze dziennie

11

Mogę znaleźć liczbę wszystkich plików w folderze, ale mam dość dużą liczbę.

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

Jak znaleźć liczbę plików dziennie?

Tak więc wynik powinien wyglądać następująco:

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

109294 2016-06-27
101555 2016-06-26
88123  2016-06-25 
... etc. 
tasmański
źródło
A jakie są liczby po lewej? 109294i109294
Sergiy Kolodyazhnyy
1
Sry, to jest liczba plików dziennie.
tasmaniski

Odpowiedzi:

21

Możesz to zrobić za pomocą printfakcji finddrukowania tylko czasów modyfikacji w żądanym formacie, a następnie za pomocą sorti uniq:

find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
  • -printf '%TY-%Tm-%Td\n'drukuje czas modyfikacji plików np. w 2015-05-23formacie

  • sortsortuje dane wyjściowe i uniq -cwykonuje zliczanie według daty

Przykład:

~/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
źródło
2
Uwaga: można je przeglądać graficznie za pomocą Gnuplot przy użyciufind . -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,
Ciekawy sposób, ale to nie działa. Mam grafikę, ale bez danych ...
tasmaniski
4

Oto rozwiązanie z 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]   }'

Zasadniczo dzieje się tak, że znajdujemy wszystkie zwykłe pliki i drukujemy ich czas modyfikacji zgodnie z %Tformatem, a następnie awkprzejmujemy i zliczamy każdą linię za pomocą macierzy skojarzonych. END{}zastosowania rachunku forpętla przejść przez wszystkie elementy w dodatkowej tablicy i wydrukować tablicę kluczy + [klawisz] zawartość (która to data + count).

Możesz użyć sortdo uporządkowania wyników, szczególnie w sort -k 1oparciu o kolumnę 1 (która jest datą), ale jest to opcjonalne. Także -maxdepth 1będzie sprawdzać pliki tylko w bieżącym folderze . Jeśli chcesz również znaleźć pliki w podkatalogach, usuń -maxdepth 1część.

Próbka wyjściowa

$ 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
źródło
Może to działać szybciej niż |sort | uniq -cwersja, szczególnie przy bardzo dużej liczbie plików i niewielkim zestawie różnych dni. Zwinięcie do liczby w jednym kroku pozwala uniknąć sortowania dużej liczby duplikatów przed zliczeniem.
Peter Cordes