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.