Cuenta el número de archivos en una carpeta por día

11

Puedo encontrar el número de todos los archivos en la carpeta pero obtuve un número bastante grande.

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

¿Cómo encontrar el número de archivos por día?

Entonces, el resultado debería ser algo como:

# 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
fuente
¿Y cuáles son los números a la izquierda? 109294y109294
Sergiy Kolodyazhnyy
1
Sry, esa es la cantidad de archivos por día.
tasmaniski

Respuestas:

21

Puede hacer esto usando la printfacción de findimprimir solo los tiempos de modificación en el formato deseado, y luego usando sorty uniq:

find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
  • -printf '%TY-%Tm-%Td\n'imprime el tiempo de modificación de archivos en, por ejemplo, 2015-05-23formato

  • sortordena la salida y uniq -ccuenta por fecha

Ejemplo:

~/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
fuente
2
NB: estos se pueden ver gráficamente con Gnuplot usandofind . -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
De manera interesante, pero no funciona. Tengo un gráfico pero sin datos ...
tasmaniski
4

Aquí hay una solución con 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]   }'

Esencialmente, lo que sucede es que encontramos todos los archivos regulares e imprimimos su tiempo de modificación según lo especificado por el %Tformato, y luego se awkhace cargo y cuenta cada línea utilizando matrices asociadas. la END{}declaración utiliza el forbucle para recorrer todos los elementos en la matriz asociada e imprimir el contenido de la clave + matriz [clave] (que es la fecha + recuento).

Es posible que desee utilizar sortpara organizar la salida, particularmente en sort -k 1función de la columna 1 (que es la fecha), pero eso es opcional. También -maxdepth 1buscará archivos solo en la carpeta actual . Si también desea encontrar archivos en subdirectorios, elimine -maxdepth 1parte.

Salida de muestra

$ 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
fuente
Esto podría ejecutarse más rápido que la |sort | uniq -cversión, especialmente con un gran número de archivos y un conjunto pequeño de días diferentes. Al colapsar para contar en un solo paso, se evita ordenar una gran cantidad de duplicados antes de contar.
Peter Cordes