Conta il numero di file in una cartella al giorno


11

Posso trovare il numero di tutti i file nella cartella ma ho un numero abbastanza grande.

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

Come trovare il numero di file al giorno?

Quindi, il risultato dovrebbe essere qualcosa del tipo:

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

109294 2016-06-27
101555 2016-06-26
88123  2016-06-25 
... etc. 

E quali sono i numeri a sinistra? 109294e109294
Sergiy Kolodyazhnyy il

1
Sry, questo è il numero di file al giorno.
tasmaniski,

Risposte:


21

Puoi farlo usando l' printfazione di findstampare solo i tempi di modifica nel formato desiderato, quindi usando sorte uniq:

find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
  • -printf '%TY-%Tm-%Td\n'stampa il tempo di modifica dei file nel 2015-05-23formato es

  • sortordina l'output ed uniq -cesegue il conteggio per data

Esempio:

~/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: questi possono essere visualizzati graficamente 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 il

Modo interessante, ma non funziona. Ho un grafico ma senza dati ...
tasmaniski,

4

Ecco una soluzione 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]   }'

In sostanza ciò che accade è che troviamo tutti i file regolari e stampiamo il loro tempo di modifica come specificato dal %Tformato, quindi awksubentra e conta ogni riga usando array associati. l' END{}istruzione utilizza il forciclo per scorrere tutti gli elementi nell'array associato e stampare i contenuti chiave + array [chiave] (che è la data + conteggio).

È possibile utilizzare sortper organizzare l'output, in particolare in sort -k 1base alla colonna 1 (che è la data), ma è facoltativo. Inoltre -maxdepth 1sarà controllare i file solo nella cartella corrente . Se si desidera trovare file anche nelle sottodirectory, rimuovere -maxdepth 1parte.

Uscita campione

$ 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

Questo potrebbe funzionare più velocemente della |sort | uniq -cversione, specialmente con un numero enorme di file e un piccolo set di giorni diversi. Il crollo dei conteggi in un solo passaggio evita l'ordinamento di un gran numero di duplicati prima del conteggio.
Peter Cordes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.