Zählen Sie die Anzahl der Dateien in einem Ordner pro Tag

11

Ich kann die Anzahl aller Dateien im Ordner finden, aber ich habe eine ziemlich große Anzahl.

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

Wie finde ich die Anzahl der Dateien pro Tag?

Das Ergebnis sollte also ungefähr so ​​aussehen:

# 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
quelle
Und wie lauten die Zahlen links? 109294und109294
Sergiy Kolodyazhnyy
1
Sry, das ist die Anzahl der Dateien pro Tag.
Tasmaniski

Antworten:

21

Sie können dies mit der mit printfWirkung findnur die Änderungszeiten in gewünschtem Format zu drucken, und dann mit sortund uniq:

find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
  • -printf '%TY-%Tm-%Td\n'druckt die Änderungszeit von Dateien im zB 2015-05-23Format

  • sortsortiert die Ausgabe und uniq -czählt nach Datum

Beispiel:

~/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
quelle
2
NB: Diese können mit Gnuplot grafisch mitfind . -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
Interessanter Weg, aber es funktioniert nicht. Ich habe eine Grafik, aber ohne Daten ...
Tasmaniski
4

Hier ist eine Lösung mit 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]   }'

Im Wesentlichen finden wir alle regulären Dateien und drucken ihre Änderungszeit gemäß dem %TFormat, übernehmen dann awkund zählen jede Zeile mithilfe zugeordneter Arrays. Die END{}Anweisung verwendet eine forSchleife, um alle Elemente im zugehörigen Array zu durchlaufen und den Inhalt von Schlüssel + Array [Schlüssel] (Datum und Anzahl) zu drucken.

Möglicherweise möchten Sie sortdie Ausgabe organisieren, insbesondere sort -k 1basierend auf Spalte 1 (Datum). Dies ist jedoch optional. Außerdem -maxdepth 1wird nur im aktuellen Ordner nach Dateien gesucht . Wenn Sie Dateien auch in Unterverzeichnissen suchen möchten, entfernen Sie das -maxdepth 1Teil.

Beispielausgabe

$ 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
quelle
Dies könnte schneller laufen als die |sort | uniq -c Version, insbesondere bei einer sehr großen Anzahl von Dateien und einer kleinen Anzahl unterschiedlicher Tage. Durch das Reduzieren auf die Anzahl in einem Schritt wird vermieden, dass eine große Anzahl von Duplikaten vor dem Zählen sortiert wird.
Peter Cordes