Unix – comment extraire des files en fonction de la partie d'un nom de file qui est la date

Dis que j'ai des files dire comme

AA_XX_20111208 AA_XX_20111207 AA_XX_20111206 AA_XX_20111205 AA_XX_20111204 AA_XX_20111203 

Donc, en utilisant la partie date, comment puis-je aller chercher les files précédents de 2 mois?

Par exemple, ce mois-ci est Février, je dois aller chercher tous les files relatifs à Janvier et Décembre. et pour le mois de mars, je dois aller chercher des files de janvier et février Cela doit arriver chaque mois.

Par exemple. pour le mois de février j'ai besoin de files de Dec et Jan

 AA_XX_20121208 AA_XX_20121207 AA_XX_20121206 

…bientôt

 AA_XX_20130108 AA_XX_20130107 AA_XX_20130106 

…bientôt

En supposant que vous avez la date GNU, cette fonction vous donnera toutes les dates des 2 mois précédents:

 dates_in_previous_two_months () { for month_delta in 0 1; do # get the last day of a previous month day=$(date -d "$(date +%Y-%m-01) -$month_delta month -1 day" +%Y%m%d) until [[ $day == *00 ]]; do echo $day ((day--)) done done } 

Pour tout jour du mois de février 2013, cela revient:

 20130131 20130130 20130129 [... and so on until ...] 20121203 20121202 20121201 

En mars, il renverra des dates de 20130228 à 20130101

Vous pourriez l'utiliser comme:

 for date in $(dates_in_previous_two_months); do "fetch" AA_XX_$date done 

ou

 dates_in_previous_two_months | xargs -I{} "fetch" AA_XX_{} 

Vous pouvez utiliser la command find . La command suivante répertorie tous les files modifiés dans les 60 derniers jours

 find . -name 'AA_XX_*' -mtime -60 

Voici un script shell pour réaliser ce que vous voulez, mais je suis d'accord que ce n'est pas une solution propre. Moi-même, je n'aime pas ce code maladroit, mais alors ça marchera pour toi, pour le time

 #!/usr/local/bin/bash YEAR=`date +%Y` MONTH=`date +%m` DATE=`date +%d` if [ $MONTH = 01 ]; then OLDEST=`expr $YEAR - 1`11010000 NEWEST=`expr $YEAR - 1`12312359 elif [ $MONTH = 02 ]; then OLDEST=`expr $YEAR - 1`12010000 echo $YEAR NEWEST="$YEAR"01312359 else case $MONTH in 03) OLDEST=$YEAR0`expr $MONTH - 2`010000 if [ $YEAR%4 = 0 ]; then DATE=29 else DATE=28 fi NEWEST=$YEAR0`expr $MONTH - 1`"$DATE"2359;; 04|06|09|11) OLDEST=$YEAR0`expr $MONTH - 2`010000 NEWEST=$YEAR0`expr $MONTH - 1`312359;; 07|08|10|12) OLDEST=$YEAR0`expr $MONTH - 2`010000 NEWEST=$YEAR0`expr $MONTH - 1`302359;; esac fi echo $OLDEST echo $NEWEST touch -t $OLDEST oldest touch -t $NEWEST newest find . -name 'AA_XX_*' -newer oldest ! -newer newest > temp.txt 

Comme ça?

 cp source/AA_XX_$(date -d "2 months ago" +%04Y%02m)* source/AA_XX_$(date -d "1 month ago" +%04Y%02m)* destination/ 

Ce mois avec l'année précédant est $(date +%Y%m) . Le mois dernier est le suivant: previous_month_1=$(date -d '1 month ago' +%Y%m) avec la date GNU (c.-à-d. Sur Linux non embedded ou Cygwin) previous_month_2=$(date -d '2 months ago' +%Y%m) . sur d'autres implémentations, ils sont donnés par

 this_month=$(date +%Y%m) case $this_month in *01) previous_month_1=$((this_month-89)); previous_month_2=$((previous_month-1));; *02) previous_month_1=$((this_month-1)); previous_month_2=$((previous_month-89));; *) previous_month_1=$((this_month-1)); previous_month_2=$((previous_month-1));; esac 

Maintenant, pour correspondre à tous les files existants datant des deux mois précédents:

 fetch "AA_XX_$previous_month_1"?? "AA_XX_$previous_month_2"?? 

(Remplacez la fetch par la command que vous voulez exécuter sur ces files.) Si un mois n'a pas de file correspondant, le model rest inchangé:

 filter_month () { case $1 in *'??') return;; esac fetch "$@" } filter_month "$previous_month_1"?? filter_month "$previous_month_2"?? 

Si vous voulez récupérer tous les files correspondant aux jours de ce mois, vous aurez besoin d'une certaine magie de la date GNU (non décrite ici) ou d'une logique bissextile.

 filter_month () { case $1 in *0[13578]|*1[02]) n=31;; *0[469]|*11) n=30;; *0002) if [ $((${1%????} %4)) -eq 0 ]; then n=29; else n=28; fi;; *02) if [ $((${1%??} %4)) -eq 0 ]; then n=29; else n=28; fi;; esac while [ $n -gt 0 ]; do d=$n if [ $d -lt 10 ]; then d=0$d; fi fetch "AA_XX_$1$d" fi } filter_month "$previous_month_1" filter_month "$previous_month_2"