source: trunk/libIGCM/libIGCM_post/check_expe_files_size.sh

Last change on this file was 1059, checked in by sdipsl, 10 years ago
  • Attach the licence when it is not the case
  • Property licence set to
    The following licence information concerns ONLY the libIGCM tools
    ==================================================================

    Copyright © Centre National de la Recherche Scientifique CNRS
    Commissariat à l'Énergie Atomique CEA

    libIGCM : Library for Portable Models Computation of IGCM Group.

    IGCM Group is the french IPSL Global Climate Model Group.

    This library is a set of shell scripts and functions whose purpose is
    the management of the initialization, the launch, the transfer of
    output files, the post-processing and the monitoring of datas produce
    by any numerical program on any plateforme.

    This software is governed by the CeCILL license under French law and
    abiding by the rules of distribution of free software. You can use,
    modify and/ or redistribute the software under the terms of the CeCILL
    license as circulated by CEA, CNRS and INRIA at the following URL
    "http://www.cecill.info".

    As a counterpart to the access to the source code and rights to copy,
    modify and redistribute granted by the license, users are provided only
    with a limited warranty and the software's author, the holder of the
    economic rights, and the successive licensors have only limited
    liability.

    In this respect, the user's attention is drawn to the risks associated
    with loading, using, modifying and/or developing or reproducing the
    software by the user in light of its specific status of free software,
    that may mean that it is complicated to manipulate, and that also
    therefore means that it is reserved for developers and experienced
    professionals having in-depth computer knowledge. Users are therefore
    encouraged to load and test the software's suitability as regards their
    requirements in conditions enabling the security of their systems and/or
    data to be ensured and, more generally, to use and operate it in the
    same conditions as regards security.

    The fact that you are presently reading this means that you have had
    knowledge of the CeCILL license and that you accept its terms.
  • 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.