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. 

¿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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.