Changeset 956 for trunk/libIGCM/libIGCM_post
- Timestamp:
- 10/08/13 16:00:57 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libIGCM/libIGCM_post/check_expe_files_size.sh
r507 r956 4 4 doc="\nScript d'analyse des fichiers d'un repertoire pour y trouver des formes \n\ 5 5 de nom de fichier avec dates, les dates, et des sequences de dates. \n\ 6 On synthetise la 6 On synthetise la 7 7 \n\n\t Syntaxe : $(basename $0) [-d] [-v/q] [-R] [-Z] dir [-S subdir] [-I maxyear]\n\n\ 8 8 L'option -R permet d'inclure les sous-repertoires\n\ … … 40 40 while [ $# -ne 0 ] 41 41 do 42 43 44 echo -e $doc45 46 47 48 # exemple de formes de dates reconnues par ce script. La liste ci-dessous est aussi 42 case $1 in 43 -h|--help|-help) 44 echo -e $doc 45 exit -1 ;; 46 -e|-exemple) 47 exemple=1 48 # exemple de formes de dates reconnues par ce script. La liste ci-dessous est aussi 49 49 # utilisee lors des tests du script 50 50 cat<<-EOF > /tmp/$$.ldir 51 51 MONEXP_20000101_20000131_1M_histmth.nc 52 52 MONEXP_20000101_20000131_1M_histmthNMC.nc … … 74 74 75 75 EOF 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 recursion=192 93 94 95 96 97 98 99 100 101 102 103 104 105 106 76 echo -e "\nExample : with this directory content\n" 77 cat /tmp/$$.ldir 78 echo -e "\n\nYou would get :\n\n" 79 break;; 80 -d|--debug) 81 set -x 82 debugflag=1 83 shift ;; 84 -q|--quiet) 85 quiet=1 86 shift ;; 87 -v|--verbose) 88 quiet=0 89 shift ;; 90 -R|-r|--r) 91 recursion=1 92 shift ;; 93 -Z|-z|--z) 94 examsize=1 95 shift ;; 96 -S|-s|--s) 97 subdir=$2 98 shift 2 ;; 99 -I|-i|--i) 100 maxyear=$2 101 (( maxyearp1 = maxyear + 1 )) 102 shift 2 ;; 103 *) 104 dir=$1 105 break ;; 106 esac 107 107 done 108 108 109 109 [ $quiet = 0 ] && echo quiet : $quiet recursion : $recursion - examsize : $examsize - dir - $dir -- subdir $subdir-- maxyearp1 : $maxyearp1 110 110 if [ $exemple = 0 ] ; then 111 [ ! -d $dir ] && echo "verif_expe_files : missing directory $dir "&& exit 112 ( cd $dir111 [ ! -d $dir ] && echo "verif_expe_files : missing directory $dir "&& exit 112 ( cd $dir 113 113 if [ $recursion = O ] ; then ls > /tmp/$$.ldir ; [ $examsize = 1 ] && ls -l > /tmp/$$.size # Cas "normal" : on liste les entrees du repertoire et ls long 114 else find ./$subdir -type f > /tmp/$$.ldir ; [ $examsize = 1 ] && find ./$subdir -type f -exec ls -l {} \; >/tmp/$$.size # Cas de listage recursif des fichiers 114 else find ./$subdir -type f > /tmp/$$.ldir ; [ $examsize = 1 ] && find ./$subdir -type f -exec ls -l {} \; >/tmp/$$.size # Cas de listage recursif des fichiers 115 115 fi 116 )116 ) 117 117 fi 118 118 ###head /tmp/$$.ldir ; head /tmp/$$.size ; rm /tmp/$$* … … 121 121 #set -x 122 122 # On remplace les / en ~ dans la liste des fichiers 123 cat /tmp/$$.ldir | tr "/" "~" > /tmp/$$.aa ; mv /tmp/$$.aa /tmp/$$.ldir 124 [ -f /tmp/$$.size ] && cat /tmp/$$.size | tr "/" "~" > /tmp/$$.aa && mv /tmp/$$.aa /tmp/$$.size 123 cat /tmp/$$.ldir | tr "/" "~" > /tmp/$$.aa ; mv /tmp/$$.aa /tmp/$$.ldir 124 [ -f /tmp/$$.size ] && cat /tmp/$$.size | tr "/" "~" > /tmp/$$.aa && mv /tmp/$$.aa /tmp/$$.size 125 125 # On deduit de la liste des fichiers des patterns de annee+mois, annee, intervalles de date ... 126 126 sed -r \ 127 128 129 130 # Ci-dessus, il faudrait compter les nb d'occ de chqaue pattern pour signaler et 127 -e 's/[0-5][0-9]{3}[01][0-9]/YYMM/g' \ 128 -e 's/YYMM01_YYMM(28|29|30|31)/YYmmdd_YYmmdd/g' \ 129 /tmp/$$.ldir | sort -u > /tmp/$$.lpat 130 # Ci-dessus, il faudrait compter les nb d'occ de chqaue pattern pour signaler et 131 131 # ne pas retenir ceux qui n'apparaissent qu'une fois (sauf les decennaux ?) 132 132 # On ote les patterns sans date du tout 133 133 sed -i -e '/YY/!d' /tmp/$$.lpat 134 134 # On rend compte des patterns identifies 135 #echo "Formes de fichier identifiees: " ; awk '{printf "\t%s\n",$1}' /tmp/$$.lpat 135 #echo "Formes de fichier identifiees: " ; awk '{printf "\t%s\n",$1}' /tmp/$$.lpat 136 136 # Une fonction pour associer un nom de fichier a chaque pattern : on remplace les / par des ~ 137 tmpfic (){ 138 echo -n "/tmp/$$." ; echo $1 | tr "/" "_"137 tmpfic (){ 138 echo -n "/tmp/$$." ; echo $1 | tr "/" "_" 139 139 } 140 # Pour chaque pattern, on liste les dates pertinentes: annees de debut et fin pour les 140 # Pour chaque pattern, on liste les dates pertinentes: annees de debut et fin pour les 141 141 # intervalles d'annees, ou annee ou annee+mois pour les autres 142 142 cat /dev/null > /tmp/$$.dates 143 143 #set -x 144 144 while read pattern ; do 145 146 # On transforme le pattern pour mettre une sequences 145 if [ $(echo $pattern | grep "YYmmdd_YYmmdd") ] ; then 146 # On transforme le pattern pour mettre une sequences 147 147 # de capture des annees de debut et fin d'intervalle 148 148 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' ) 149 149 150 150 # On balaye le repertoire avec le(s) pattern(s) transforme(s) pour capturer les annees 151 152 153 154 # Si la liste des date (annees ou annes+mois) pour le pattern est 151 grep -E $p2 /tmp/$$.ldir | sed -r -e "s/$p2/\1/g" >> /tmp/$$.$pattern.tmp 152 fi 153 sort -n -u /tmp/$$.$pattern.tmp > /tmp/$$.$pattern.list 154 # Si la liste des date (annees ou annes+mois) pour le pattern est 155 155 # de taille > 1, on l'integre a la liste generale des dates 156 156 # en supprimant au prealable les dates isolees 157 157 # ... ca reste a faire 158 158 cat /tmp/$$.$pattern.list | cut -c 1-4 >> /tmp/$$.dates 159 159 done < /tmp/$$.lpat 160 160 # Fonction pour completer et rendre sequentielle une liste d'annees (une par ligne) 161 161 force_sequence (){ 162 162 awk '{ 163 163 if (NR==1) {avant=$1; print $1} 164 164 else { for (i=avant+1 ; i<=$1 ; i++) printf "%04i\n", i}}' … … 168 168 force_sequence < /tmp/$$.toutes_dates > /tmp/$$.tmp ; sort -u /tmp/$$.tmp > /tmp/$$.toutes_dates 169 169 # Fonction d'analyse de sequences de nombres (annees, ou annees+mois 170 # On transforme les series continues a a+1 a+2....b (a raison d'un par 170 # On transforme les series continues a a+1 a+2....b (a raison d'un par 171 171 # ligne) en : "a-b" 172 172 sequence (){ 173 173 awk -v pas=${1:-1} '{ 174 174 if (NR==1) {avant=$1;nb=1; printf "%s",$1} 175 else { 175 else { 176 176 suivant=avant+pas 177 # Pour les nombres sur 6 chiffres, on suppose que c est du YYYMM 177 # Pour les nombres sur 6 chiffres, on suppose que c est du YYYMM 178 178 # et on gere le passage de decembre a janvier 179 if ((length(avant)==6) && (substr(avant,5,2)=="12")) 179 if ((length(avant)==6) && (substr(avant,5,2)=="12")) 180 180 { avant4=substr(avant,1,4) ; suivant=sprintf("%4d01",avant4+1)} 181 181 if ($1 > suivant) { … … 184 184 else { nb=nb+1 } 185 185 avant=$1 }} 186 END { if (nb >1) printf "-%s\n",avant ; else print ""} ' 186 END { if (nb >1) printf "-%s\n",avant ; else print ""} ' 187 187 } 188 188 [ $quiet = 0 ] && echo $(wc -l /tmp/$$.ldir | cut -d \ -f 1) files proceeded. 189 [ $quiet = 0 ] && echo -n "Years occurring : " && sequence 1 < /tmp/$$.toutes_dates 189 [ $quiet = 0 ] && echo -n "Years occurring : " && sequence 1 < /tmp/$$.toutes_dates 190 190 # on ne garde que les annees inferieures a maxyear 191 191 sed "/$maxyearp1/"',$d' </tmp/$$.toutes_dates >/tmp/$$.toutes_dates_maxyear 192 [ $quiet = 0 ] && echo -n "Years tested : " && sequence 1 < /tmp/$$.toutes_dates_maxyear 192 [ $quiet = 0 ] && echo -n "Years tested : " && sequence 1 < /tmp/$$.toutes_dates_maxyear 193 193 mv /tmp/$$.toutes_dates_maxyear /tmp/$$.toutes_dates 194 194 # On liste tous les mois qui doivent etre presents (au motif qu'une annee est presente) 195 195 > /tmp/$$.toutes_dates_et_mois 196 196 while read an ; do 197 198 199 200 201 197 i=1 198 while [ $i -le 12 ] ; do 199 printf "%s%02d\n" ${an} $i >> /tmp/$$.toutes_dates_et_mois 200 i=$(( i + 1 )) 201 done 202 202 done < /tmp/$$.toutes_dates 203 203 # Pour chaque pattern, on analyse si toutes les dates sont presentes en bon nombre (decennie, an, an+mois) … … 206 206 #set -x 207 207 while read pattern ; do 208 209 join -v 1 /tmp/$$.toutes_dates_et_mois /tmp/$$.$pattern.list > /tmp/$$.$pattern.manques210 sequence $pas < /tmp/$$.$pattern.manques > /tmp/$$.$pattern.synthese211 212 213 208 [ `echo $pattern | grep -E "(YYmmdd_YYmmdd)"` ] && pas=1 && \ 209 join -v 1 /tmp/$$.toutes_dates_et_mois /tmp/$$.$pattern.list > /tmp/$$.$pattern.manques 210 sequence $pas < /tmp/$$.$pattern.manques > /tmp/$$.$pattern.synthese 211 truepattern=$(echo $pattern | tr "~" "/") 212 [ $quiet = 0 ] && printf "%80s : " $truepattern && cat /tmp/$$.$pattern.synthese 213 cat /tmp/$$.$pattern.synthese >> /tmp/$$.synthese 214 214 done < /tmp/$$.lpat 215 215 … … 217 217 if [ $examsize = 0 ] ; then rm /tmp/$$* ; exit $rep ; fi 218 218 219 # taille des fichiers 219 # taille des fichiers 220 220 cat /dev/null > /tmp/$$.dates 221 221 #set -x 222 222 while read pattern ; do 223 224 225 226 227 # On transforme le pattern pour mettre une sequences 223 i=1 224 while [ $i -le 12 ] ; do 225 mois=$(printf "%02d\n" $i) 226 if [ $(echo $pattern | grep "YYmmdd_YYmmdd") ] ; then 227 # On transforme le pattern pour mettre une sequences 228 228 # avec le mois courant 229 229 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" ) 230 230 231 231 # On balaye le repertoire avec le(s) pattern(s) transforme(s) pour capturer les tailles des fichiers de ce mois 232 232 grep -E $px /tmp/$$.size | awk '{print $5}' | sort -u >/tmp/$$.$pattern.size_${mois} 233 233 # On garde les infos s il n y a pas une taille unique 234 235 236 done237 238 239 done234 for size in $(cat /tmp/$$.$pattern.size_${mois}) ; do 235 grep -E $px /tmp/$$.size | grep " "${size}" " | tr "~" "/" >>/tmp/$$.$pattern.files_${mois}.${size} 236 done 237 fi 238 i=$(( i + 1 )) 239 done 240 240 done < /tmp/$$.lpat 241 241 … … 245 245 touch /tmp/$$.synthese_size 246 246 while read pattern ; do 247 248 [ $quiet = 0 ] && printf "%80s : " $truepattern249 250 251 252 253 if [ $(wc -l /tmp/$$.$pattern.size_${mois} | cut -d " " -f 1) = 1 ] ; then254 RESULT="$RESULT "255 else247 truepattern=$(echo $pattern | tr "~" "/") 248 [ $quiet = 0 ] && printf "%80s : " $truepattern 249 if [ `echo $pattern | grep -E "(YYmmdd_YYmmdd)"` ] ; then 250 RESULT="" 251 for i in 1 2 3 4 5 6 7 8 9 10 11 12 ; do 252 mois=$(printf "%02d\n" $i) 253 if [ $(wc -l /tmp/$$.$pattern.size_${mois} | cut -d " " -f 1) = 1 ] ; then 254 RESULT="$RESULT " 255 else 256 256 # special case for february , we accept 2 different sizes for february for leap year 257 257 if [[ $i == 2 && $(wc -l /tmp/$$.$pattern.size_${mois} | cut -d " " -f 1) = 2 ]] ; then 258 258 # est ce qu il y a des mois de 29 jours? si non souci reel 259 260 261 262 263 264 265 266 RESULT="$RESULT \033[1;31m[$mois]\033[m"267 268 269 270 done271 272 259 if [ $( grep 0229 /tmp/$$.$pattern.files_02.* 1>/dev/null 2>&1 ) ] ; then 260 RESULT="$RESULT \033[1;31m[$mois]\033[m" 261 cat /tmp/$$.$pattern.size_${mois} >> /tmp/$$.synthese_size 262 else 263 RESULT="$RESULT " 264 fi 265 else 266 RESULT="$RESULT \033[1;31m[$mois]\033[m" 267 cat /tmp/$$.$pattern.size_${mois} >> /tmp/$$.synthese_size 268 fi 269 fi 270 done 271 [ $quiet = 0 ] && echo -e $RESULT 272 fi 273 273 done < /tmp/$$.lpat 274 274 275 275 # affichage des details 276 276 while read pattern ; do 277 278 279 280 281 282 277 first=0 278 i=1 279 truepattern=$(echo $pattern | tr "~" "/") 280 while [ $i -le 12 ] ; do 281 mois=$(printf "%02d\n" $i) 282 if [ $(echo $pattern | grep "YYmmdd_YYmmdd") ] ; then 283 283 # si on a plus de 2 tailles de fichiers pour ce mois, on liste le nombre de fichiers par taille et les 3 premiers 284 284 # cas special pour fevrier qui accepte 2 tailles differentes si 1 pour les 28 et l autre pour les 29 285 286 285 if [ $(wc -l /tmp/$$.$pattern.size_${mois} | cut -d " " -f 1) != 1 ] ; then 286 if [[ $i == 2 && $(wc -l /tmp/$$.$pattern.size_${mois} | cut -d " " -f 1) == 2 ]] ; then 287 287 # est ce qu il y a des mois de 29 jours? sinon souci reel 288 if [ $( grep 0229 /tmp/$$.$pattern.files_02* 1>/dev/null 2>&1 ) ] ; then289 290 291 292 293 294 295 296 297 echo mois : ${mois}298 299 300 301 302 303 304 305 288 if [ $( grep 0229 /tmp/$$.$pattern.files_02* 1>/dev/null 2>&1 ) ] ; then 289 if [[ ${first} == 0 ]] ; then printf "Details %73s : \n" $truepattern ; first=1 ; fi 290 echo mois : ${mois} 291 for size in $( cat /tmp/$$.$pattern.size_${mois} ) ; do 292 head -1 /tmp/$$.$pattern.files_${mois}.${size} 293 done 294 fi 295 else 296 if [[ ${first} == 0 ]] ; then printf "Details %73s : \n" $truepattern ; first=1 ; fi 297 echo mois : ${mois} 298 for size in $( cat /tmp/$$.$pattern.size_${mois} ) ; do 299 head -1 /tmp/$$.$pattern.files_${mois}.${size} 300 done 301 fi 302 fi 303 fi 304 i=$(( i + 1 )) 305 done 306 306 done < /tmp/$$.lpat 307 307 … … 313 313 [ $debugflag = 0 ] && rm -f /tmp/$$.* /tmp/$$.ldir 314 314 exit $rep 315 # Changes 315 # Changes 316 316 # - 20 april 2010 : add handling of pattern year1-year2, which is a generalization of decades 317 317 # - janvier 2011 : suppression des caracteres accentues … … 319 319 # ajout de la verification des tailles des fichiers mensuels 320 320 # ajout des options -d -q/-v -R -S subdir -I maxyear 321 322
Note: See TracChangeset
for help on using the changeset viewer.