Sur Linux, essayez:
find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort
Comment ça fonctionne
find /my/path
Cela recherche les fichiers dans / mon / chemin.
-maxdepth 1
Cela indique de findne pas regarder dans les sous-répertoires. (Si vous souhaitez une recherche récursive, omettez cette option.)
-type f
Cela indique findde limiter la recherche aux fichiers normaux.
-printf '%TY-%Tm %s\n'
Cela indique findd'imprimer l'année-mois suivi de la taille en octets pour chaque fichier.
Comme nous ne les utilisons pas, les noms des fichiers trouvés ne sont pas imprimés.
b[$1]+=$2
Pour chaque fichier trouvé, nous ajoutons son nombre d'octets, trouvé dans la colonne 2, au nombre de cette combinaison année-mois dans le tableau associatif b.
END{for (date in b) print date, b[date]}
Après avoir traité toutes les sorties de find, nous imprimons les résultats.
sort
Cela trie les résultats par ordre de date.
Version à plusieurs lignes
Pour ceux qui préfèrent leur code étalé sur plusieurs lignes:
find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' |
awk '
{
b[$1]+=$2
}
END{
for (date in b)
print date, b[date]
}
' | sort
Exemple
Prenons un répertoire avec ces fichiers:
$ ls -l
total 27816
-rw------- 1 john1024 john1024 2459173 Nov 23 2015 img100.jpg
-rw------- 1 john1024 john1024 3479750 Nov 23 2015 img101.jpg
-rw------- 1 john1024 john1024 4028939 Nov 23 2015 img102.jpg
-rw------- 1 john1024 john1024 2928519 Jul 30 18:55 img103.jpg
-rw------- 1 john1024 john1024 2948294 Jul 30 18:55 img104.jpg
-rw------- 1 john1024 john1024 3177583 Aug 1 16:56 img105.jpg
-rw-rw---- 1 john1024 john1024 3111737 Apr 18 2016 img106.jpg
-rw-rw---- 1 john1024 john1024 1441310 Apr 18 2016 img107.jpg
-rw-rw---- 1 john1024 john1024 2430158 Apr 25 16:26 img108.jpg
-rw-rw---- 1 john1024 john1024 2424504 Apr 25 16:26 img109.jpg
La sortie de notre commande est:
$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort
2015-11 9967862
2016-04 9407709
2016-07 5876813
2016-08 3177583
Raffinements
Si nous voulons la sortie en mégaoctets (MiB) au lieu d'octets, nous pouvons convertir les unités comme ceci:
$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]/1024**2, "MiB"}' | sort
2015-11 9.50609 MiB
2016-04 8.97189 MiB
2016-07 5.60457 MiB
2016-08 3.03038 MiB
Nous pouvons obtenir encore plus de contrôle sur le format de sortie en utilisant printf. Ici, pour ne conserver qu'un chiffre après le point décimal, nous formaterons la taille avec %5.1f:
$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) printf "%s %5.1f MiB\n", date, b[date]/1024**2}' | sort
2015-11 9.5 MiB
2016-04 9.0 MiB
2016-07 5.6 MiB
2016-08 3.0 MiB