Contar o número de arquivos em uma pasta por dia

11

Posso encontrar o número de todos os arquivos na pasta, mas tenho um número bastante grande.

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

Como encontrar o número de arquivos por dia?

Portanto, o resultado deve 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
fonte
E quais são os números à esquerda? 109294e109294
Sergiy Kolodyazhnyy
1
Sry, esse é o número de arquivos por dia.
tasmaniski

Respostas:

21

Você pode fazer isso usando a printfação de findpara imprimir apenas os tempos de modificação no formato desejado e, em seguida, usando sorte uniq:

find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
  • -printf '%TY-%Tm-%Td\n'imprime a hora da modificação dos arquivos, por exemplo, no 2015-05-23formato

  • sortclassifica a saída e uniq -cfaz a contagem por data

Exemplo:

~/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
heemail
fonte
2
NB: eles podem ser visualizados graficamente com o Gnuplot usando #find . -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
Maneira interessante, mas não funciona. Eu tenho um gráfico, mas sem dados ...
tasmaniski
4

Aqui está uma solução com 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]   }'

Essencialmente, o que acontece é que encontramos todos os arquivos regulares e imprimimos seu tempo de modificação conforme especificado pelo %Tformato, assumimos o awkcontrole e contamos cada linha usando matrizes associadas. a END{}instrução usa forloop para percorrer todos os elementos da matriz associada e imprimir o conteúdo da chave + matriz [chave] (que é a data + contagem).

Você pode usar sortpara organizar a saída, principalmente com sort -k 1base na coluna 1 (que é data), mas isso é opcional. Também -maxdepth 1procurará arquivos apenas na pasta atual . Se você também deseja encontrar arquivos em subdiretórios, remova a -maxdepth 1peça.

Saída de amostra

$ 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
fonte
Isso pode ser executado mais rapidamente que a |sort | uniq -cversão, especialmente com um grande número de arquivos e um conjunto pequeno de dias diferentes. Reduzir para contagens em uma etapa evita a classificação de um grande número de duplicatas antes da contagem.
Peter Cordes