Compter le nombre de fichiers dans un dossier par jour


11

Je peux trouver le nombre de tous les fichiers dans le dossier, mais j'ai obtenu un assez grand nombre.

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

Comment trouver le nombre de fichiers par jour?

Ainsi, le résultat devrait être quelque chose comme:

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

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

Et quels sont les chiffres à gauche? 109294et109294
Sergiy Kolodyazhnyy

1
Sry, c'est le nombre de fichiers par jour.
tasmaniski

Réponses:


21

Vous pouvez le faire en utilisant l' printfaction de findpour imprimer uniquement les heures de modification dans le format souhaité, puis en utilisant sortet uniq:

find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
  • -printf '%TY-%Tm-%Td\n'imprime l'heure de modification des fichiers au 2015-05-23format par exemple

  • sorttrie la sortie et uniq -cfait le décompte par date

Exemple:

~/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: ceux-ci peuvent être visualisés graphiquement avec Gnuplot en utilisantfind . -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

Façon intéressante, mais cela ne fonctionne pas. J'ai un graphique mais sans données ...
tasmaniski

4

Voici une solution avec 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]   }'

Ce qui se passe essentiellement, c'est que nous trouvons tous les fichiers normaux et imprimons leur heure de modification comme spécifié par le %Tformat, puis awkprend le relais et compte chaque ligne à l'aide de tableaux associés. l' END{}instruction utilise une forboucle pour parcourir tous les éléments du tableau associé et imprimer le contenu clé + tableau [clé] (qui est la date + le nombre).

Vous pouvez utiliser sortpour organiser la sortie, en particulier en sort -k 1fonction de la colonne 1 (qui est la date), mais cela est facultatif. Aussi -maxdepth 1vérifiera les fichiers uniquement dans le dossier en cours . Si vous souhaitez également rechercher des fichiers dans des sous-répertoires, supprimez une -maxdepth 1partie.

Exemple de sortie

$ 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

Cela peut s'exécuter plus rapidement que la |sort | uniq -cversion, en particulier avec un très grand nombre de fichiers et un ensemble de jours différents. Réduire en nombre en une seule étape évite de trier un grand nombre de doublons avant de compter.
Peter Cordes
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.