source: trunk/libIGCM/libIGCM_post/check_expe_files_size.sh @ 1044

Last change on this file since 1044 was 1044, checked in by sdipsl, 10 years ago

Clean up properties and headers

  • Property svn:executable set to *
  • Property svn:keywords set to Date Author Rev
File size: 13.8 KB
Line 
1#!/bin/sh
2##set -xv
3#**************************************************************
4# Author: Marie-Alice Foujols
5# Contact: Marie-Alice.Foujols__at__ipsl.jussieu.fr
6# $Revision::                                          $ Revision of last commit
7# $Author::                                            $ Author of last commit
8# $Date::                                              $ Date of last commit
9# IPSL (2009)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11#
12#**************************************************************
13# stephane.senesi 'at' meteo.fr, CNRM-GAME/GMGEC, mars-avril 2010
14doc="\nScript d'analyse des fichiers d'un repertoire pour y trouver des formes \n\
15de nom de fichier avec dates, les dates, et des sequences de dates. \n\
16On synthetise la
17\n\n\t Syntaxe : $(basename $0) [-d] [-v/q] [-R] [-Z] dir [-S subdir] [-I maxyear]\n\n\
18L'option -R permet d'inclure les sous-repertoires\n\
19L'option -Z permet de verifier que les tailles des fichiers mensuels sont identiques par mois\n\
20dir permet de decrire le repertoire selectionne : . par defaut \n\
21-S subdir permet de decrire les sous-repertoires selectionnes : \*/Output par exemple\n\
22-I maxyear ne traite que les dates inferieures ou egales a maxyear. Toutes les dates par defaut\n\
23Les formes de dates identifiables sont illustrees dans l'exemple obtenu par \n\
24    \t$(basename $0) -exemple\n\
25la valeur retournee est le nombre de formes de noms de fichier qui presentent des trous\n
26Si l option -Z est precisee, le code retour y ajoute le nombre de mois avec tailles differentes.\n
27-q pour n avoir aucun message / -v pour avoir les patterns et erreurs  a  l ecran \n
28-d pour activer l echo des commandes \n
29Exemples :\n
30check_expe_files_size.sh SRF/Output/MO # verification des noms du repertoire SRF/Output/MO\n
31check_expe_files_size.sh -Z SRF/Output/MO # verification des noms et des tailles des fichiers du repertoire\n
32check_expe_files_size.sh -R -S \"*/Output\" # verification des noms des fichiers pour toute une simulation IPSL\n
33check_expe_files_size.sh -Z -R -S \"*/Output\" # verification des noms et des tailles des fichiers pour toute une simulation IPSL\n
34check_expe_files_size.sh -I 1949 -R -S \"*/Output\" # verification jusuque a l annee 1949 incluse des noms des fichiers pour une simulation IPSL\n
35"
36#La presence d'une annee+mois impose la presence de l'annee entiere
37[ $# -eq 0  ]  && echo -e $doc && exit -1
38
39debugflag=0
40quiet=0
41exemple=0
42recursion=0
43examsize=0
44dir=.
45subdir=
46maxyear=9999
47maxyearp1=9999
48
49#---------------------------------------------
50while [ $# -ne 0 ]
51do
52  case $1 in
53  -h|--help|-help)
54    echo -e $doc
55    exit -1 ;;
56  -e|-exemple)
57    exemple=1
58# exemple de formes de dates reconnues par ce script. La liste ci-dessous est aussi
59# utilisee lors des tests du script
60    cat<<-EOF > /tmp/$$.ldir
61MONEXP_20000101_20000131_1M_histmth.nc
62MONEXP_20000101_20000131_1M_histmthNMC.nc
63MONEXP_20000201_20000228_1M_histmth.nc
64MONEXP_20000201_20000228_1M_histmthNMC.nc
65MONEXP_20000301_20000331_1M_histmth.nc
66MONEXP_20000301_20000331_1M_histmthNMC.nc
67MONEXP_20000401_20000430_1M_histmth.nc
68MONEXP_20000401_20000430_1M_histmthNMC.nc
69MONEXP_20000501_20000531_1M_histmth.nc
70MONEXP_20000501_20000531_1M_histmthNMC.nc
71MONEXP_20000601_20000630_1M_histmth.nc
72MONEXP_20000601_20000630_1M_histmthNMC.nc
73MONEXP_20000701_20000731_1M_histmth.nc
74MONEXP_20000701_20000731_1M_histmthNMC.nc
75MONEXP_20000801_20000831_1M_histmth.nc
76MONEXP_20000801_20000831_1M_histmthNMC.nc
77MONEXP_20000901_20000930_1M_histmth.nc
78MONEXP_20000901_20000930_1M_histmthNMC.nc
79MONEXP_20001001_20001031_1M_histmth.nc
80MONEXP_20001001_20001031_1M_histmthNMC.nc
81MONEXP_20001101_20001130_1M_histmthNMC.nc
82MONEXP_20001201_20001231_1M_histmth.nc
83MONEXP_20001201_20001231_1M_histmthNMC.nc
84
85EOF
86    echo -e "\nExample : with this directory content\n"
87    cat  /tmp/$$.ldir
88    echo -e "\n\nYou would get :\n\n"
89    break;;
90  -d|--debug)
91    set -x
92    debugflag=1
93    shift ;;
94  -q|--quiet)
95    quiet=1
96    shift ;;
97  -v|--verbose)
98    quiet=0
99    shift ;;
100  -R|-r|--r)
101    recursion=1
102    shift ;;
103  -Z|-z|--z)
104    examsize=1
105    shift ;;
106  -S|-s|--s)
107    subdir=$2
108    shift 2 ;;
109  -I|-i|--i)
110    maxyear=$2
111    (( maxyearp1 = maxyear + 1 ))
112    shift 2 ;;
113  *)
114    dir=$1
115    break ;;
116  esac
117done
118
119[ $quiet = 0 ] && echo quiet : $quiet recursion : $recursion - examsize : $examsize - dir - $dir -- subdir $subdir-- maxyearp1 : $maxyearp1
120if [ $exemple = 0 ] ; then
121  [ ! -d $dir ] && echo "verif_expe_files : missing directory $dir "&& exit
122  ( cd $dir
123    if [ $recursion = O ] ; then ls > /tmp/$$.ldir ; [ $examsize = 1 ] && ls -l > /tmp/$$.size # Cas "normal" : on liste les entrees du repertoire et ls long
124    else find ./$subdir  -type f > /tmp/$$.ldir ; [ $examsize = 1 ] && find ./$subdir -type f -exec ls -l {} \; >/tmp/$$.size # Cas de listage recursif des fichiers
125    fi
126  )
127fi
128###head /tmp/$$.ldir ; head /tmp/$$.size ; rm /tmp/$$*
129# For debugging purpose ...
130#head -n 2 /tmp/$$.ldir > /tmp/$$.aa ; mv /tmp/$$.aa /tmp/$$.ldir
131#set -x
132# On remplace les / en ~ dans la liste des fichiers
133cat /tmp/$$.ldir | tr "/" "~" > /tmp/$$.aa ; mv /tmp/$$.aa /tmp/$$.ldir
134[ -f /tmp/$$.size ] && cat /tmp/$$.size | tr "/" "~" > /tmp/$$.aa && mv /tmp/$$.aa /tmp/$$.size
135# On deduit de la liste des fichiers des patterns de annee+mois, annee, intervalles de date ...
136sed -r \
137  -e 's/[0-5][0-9]{3}[01][0-9]/YYMM/g' \
138  -e 's/YYMM01_YYMM(28|29|30|31)/YYmmdd_YYmmdd/g' \
139  /tmp/$$.ldir | sort -u > /tmp/$$.lpat
140# Ci-dessus, il faudrait compter les nb d'occ de chqaue pattern pour signaler et
141# ne pas retenir ceux qui n'apparaissent qu'une fois (sauf les decennaux ?)
142# On ote les patterns sans date du tout
143sed -i -e '/YY/!d' /tmp/$$.lpat
144# On rend compte des patterns identifies
145#echo "Formes de fichier identifiees: " ; awk '{printf "\t%s\n",$1}' /tmp/$$.lpat
146# Une fonction pour associer un nom de fichier a chaque pattern : on remplace les / par des ~
147tmpfic (){
148  echo -n "/tmp/$$." ; echo $1 | tr "/" "_"
149}
150# Pour chaque pattern, on liste les dates pertinentes: annees de debut et fin pour les
151# intervalles d'annees, ou annee ou annee+mois pour les autres
152cat /dev/null > /tmp/$$.dates
153#set -x
154while read pattern ; do
155  if [ $(echo $pattern | grep "YYmmdd_YYmmdd") ] ; then
156        # On transforme le pattern pour mettre une sequences
157        # de capture des annees de debut et fin d'intervalle
158    p2=$(echo $pattern | sed -e 's/YYmmdd_YYmmdd/([0-5][0-9]{3}[01][0-9])01_[0-5][0-9]{3}[01][0-9](28|29|30|31)/g' )
159
160       # On balaye le repertoire avec le(s) pattern(s) transforme(s) pour capturer les annees
161    grep -E $p2 /tmp/$$.ldir | sed -r -e "s/$p2/\1/g"  >> /tmp/$$.$pattern.tmp
162  fi
163  sort -n -u /tmp/$$.$pattern.tmp > /tmp/$$.$pattern.list
164    # Si la liste des date (annees ou annes+mois) pour le pattern est
165    # de taille > 1, on l'integre a la liste generale des dates
166    # en supprimant au prealable les dates isolees
167    # ... ca reste a faire
168  cat /tmp/$$.$pattern.list | cut -c 1-4 >> /tmp/$$.dates
169done < /tmp/$$.lpat
170# Fonction pour completer et rendre sequentielle une liste d'annees (une par ligne)
171force_sequence (){
172  awk '{
173        if (NR==1) {avant=$1; print $1}
174        else { for (i=avant+1 ; i<=$1 ; i++) printf "%04i\n", i}}'
175}
176sort -u /tmp/$$.dates > /tmp/$$.toutes_dates
177# On enleve les trous dans la liste des dates
178force_sequence < /tmp/$$.toutes_dates > /tmp/$$.tmp ; sort -u /tmp/$$.tmp > /tmp/$$.toutes_dates
179# Fonction d'analyse de sequences de nombres (annees, ou annees+mois
180# On transforme les series continues a a+1 a+2....b (a raison d'un par
181# ligne) en : "a-b"
182sequence (){
183  awk -v pas=${1:-1} '{
184        if (NR==1) {avant=$1;nb=1; printf "%s",$1}
185        else {
186          suivant=avant+pas
187          # Pour les nombres sur 6 chiffres, on suppose que c est du YYYMM
188          # et on gere le passage de decembre a janvier
189          if ((length(avant)==6) && (substr(avant,5,2)=="12"))
190            { avant4=substr(avant,1,4) ; suivant=sprintf("%4d01",avant4+1)}
191          if ($1 > suivant) {
192            if (nb>1) printf "-%s",avant
193            nb=1 ; printf ", %s",$1}
194          else { nb=nb+1 }
195          avant=$1  }}
196      END { if (nb >1) printf "-%s\n",avant ; else print ""} '
197}
198[ $quiet = 0 ] && echo $(wc -l /tmp/$$.ldir | cut -d \  -f 1) files proceeded.
199[ $quiet = 0 ] && echo -n "Years occurring : " && sequence 1 < /tmp/$$.toutes_dates
200# on ne garde que les annees inferieures a maxyear
201sed "/$maxyearp1/"',$d' </tmp/$$.toutes_dates >/tmp/$$.toutes_dates_maxyear
202[ $quiet = 0 ] && echo -n "Years tested : " && sequence 1 < /tmp/$$.toutes_dates_maxyear
203mv /tmp/$$.toutes_dates_maxyear /tmp/$$.toutes_dates
204# On liste tous les mois qui doivent etre presents (au motif qu'une annee est presente)
205> /tmp/$$.toutes_dates_et_mois
206while read an ; do
207  i=1
208  while [ $i -le 12 ] ; do
209    printf "%s%02d\n" ${an} $i  >> /tmp/$$.toutes_dates_et_mois
210    i=$(( i + 1 ))
211  done
212done < /tmp/$$.toutes_dates
213# Pour chaque pattern, on analyse si toutes les dates sont presentes en bon nombre (decennie, an, an+mois)
214touch /tmp/$$.synthese
215[ $quiet = 0 ] && echo "File name patterns and holes (if any) :"
216#set -x
217while read pattern ; do
218  [ `echo $pattern | grep -E "(YYmmdd_YYmmdd)"` ]  && pas=1 && \
219    join -v 1 /tmp/$$.toutes_dates_et_mois  /tmp/$$.$pattern.list > /tmp/$$.$pattern.manques
220  sequence $pas < /tmp/$$.$pattern.manques > /tmp/$$.$pattern.synthese
221  truepattern=$(echo $pattern | tr "~" "/")
222  [ $quiet = 0 ] && printf "%80s : " $truepattern  && cat /tmp/$$.$pattern.synthese
223  cat /tmp/$$.$pattern.synthese >> /tmp/$$.synthese
224done < /tmp/$$.lpat
225
226rep=$(wc -w /tmp/$$.synthese | tail -1 | cut -d \  -f 1)
227if [ $examsize = 0 ] ; then rm /tmp/$$* ; exit $rep ; fi
228
229# taille des fichiers
230cat /dev/null > /tmp/$$.dates
231#set -x
232while read pattern ; do
233  i=1
234  while [ $i -le 12 ] ; do
235    mois=$(printf "%02d\n"  $i)
236    if [ $(echo $pattern | grep "YYmmdd_YYmmdd") ] ; then
237           # On transforme le pattern pour mettre une sequences
238           # avec le mois courant
239      px=$(echo $pattern | sed -e "s/YYmmdd_YYmmdd/([0-5][0-9]{3})${mois}01_[0-5][0-9]{3}${mois}(28|29|30|31)/g" )
240
241           # On balaye le repertoire avec le(s) pattern(s) transforme(s) pour capturer les tailles des fichiers de ce mois
242      grep -E $px /tmp/$$.size | awk '{print $5}' | sort -u >/tmp/$$.$pattern.size_${mois}
243           # On garde les infos s il n y a pas une taille unique
244      for size in $(cat /tmp/$$.$pattern.size_${mois})  ; do
245        grep -E $px /tmp/$$.size | grep " "${size}" " | tr "~" "/" >>/tmp/$$.$pattern.files_${mois}.${size}
246      done
247    fi
248    i=$(( i + 1 ))
249  done
250done < /tmp/$$.lpat
251
252[ $quiet = 0 ] && echo
253[ $quiet = 0 ] && echo  "Size verification per month (if different) :"
254# Pour chaque pattern, on liste la taille des fichiers de chaque mois
255touch /tmp/$$.synthese_size
256while read pattern ; do
257  truepattern=$(echo $pattern | tr "~" "/")
258  [ $quiet = 0 ] && printf "%80s : " $truepattern
259  if [ `echo $pattern | grep -E "(YYmmdd_YYmmdd)"` ]  ; then
260    RESULT=""
261    for i in 1 2 3 4 5 6 7 8 9 10 11 12 ; do
262      mois=$(printf "%02d\n"  $i)
263      if [ $(wc -l /tmp/$$.$pattern.size_${mois} |  cut -d " " -f 1) = 1 ] ; then
264        RESULT="$RESULT "
265      else
266                # special case for february , we accept 2 different sizes for february for leap year
267        if [[ $i == 2 && $(wc -l /tmp/$$.$pattern.size_${mois} |  cut -d " " -f 1) = 2 ]] ; then
268                   # est ce qu il y a des mois de 29 jours? si non souci reel
269          if [ $( grep 0229 /tmp/$$.$pattern.files_02.* 1>/dev/null 2>&1 ) ] ; then
270            RESULT="$RESULT \033[1;31m[$mois]\033[m"
271            cat  /tmp/$$.$pattern.size_${mois} >> /tmp/$$.synthese_size
272          else
273            RESULT="$RESULT "
274          fi
275        else
276          RESULT="$RESULT \033[1;31m[$mois]\033[m"
277          cat  /tmp/$$.$pattern.size_${mois} >> /tmp/$$.synthese_size
278        fi
279      fi
280    done
281    [ $quiet = 0 ] && echo -e $RESULT
282  fi
283done < /tmp/$$.lpat
284
285# affichage des details
286while read pattern ; do
287  first=0
288  i=1
289  truepattern=$(echo $pattern | tr "~" "/")
290  while [ $i -le 12 ] ; do
291    mois=$(printf "%02d\n"  $i)
292    if [ $(echo $pattern | grep "YYmmdd_YYmmdd") ] ; then
293           # si on a plus de 2 tailles de fichiers pour ce mois, on liste le nombre de fichiers par taille et les 3 premiers
294           # cas special pour fevrier qui accepte 2 tailles differentes si 1 pour les 28 et l autre pour les 29
295      if [ $(wc -l /tmp/$$.$pattern.size_${mois} | cut -d " " -f 1) != 1 ] ; then
296        if  [[ $i == 2 && $(wc -l /tmp/$$.$pattern.size_${mois} |  cut -d " " -f 1) == 2 ]] ; then
297                   # est ce qu il y a des mois de 29 jours? sinon souci reel
298          if [ $( grep 0229 /tmp/$$.$pattern.files_02* 1>/dev/null 2>&1 ) ] ; then
299            if [[ ${first} == 0 ]] ; then printf "Details %73s : \n" $truepattern ; first=1 ; fi
300            echo mois : ${mois}
301            for size in $( cat /tmp/$$.$pattern.size_${mois} ) ; do
302              head -1 /tmp/$$.$pattern.files_${mois}.${size}
303            done
304          fi
305        else
306          if [[ ${first} == 0 ]] ; then printf "Details %73s : \n" $truepattern ; first=1 ; fi
307          echo mois : ${mois}
308          for size in $( cat /tmp/$$.$pattern.size_${mois} ) ; do
309            head -1 /tmp/$$.$pattern.files_${mois}.${size}
310          done
311        fi
312      fi
313    fi
314    i=$(( i + 1 ))
315  done
316done < /tmp/$$.lpat
317
318
319rep=$(wc -w /tmp/$$.synthese /tmp/$$.synthese_size | tail -1 | sed -e 's/total//' -e 's/ //g' )
320
321# reste  a analyser par annee en sus de par pattern, pour presenter le plus clair
322# Penser a forunir l'option d'imposer des patterns et des annees en entree
323[ $debugflag = 0 ] && rm -f /tmp/$$.* /tmp/$$.ldir
324exit $rep
325# Changes
326# - 20 april 2010 : add handling of pattern year1-year2, which is a generalization of decades
327# - janvier 2011 : suppression des caracteres accentues
328#                  mise en place pour prefix de type libIGCM / IPSL
329#                  ajout de la verification des tailles des fichiers mensuels
330#                  ajout des options -d -q/-v -R -S subdir -I maxyear
Note: See TracBrowser for help on using the repository browser.