Récup de fichiers récents via script shell

Résolu
Marsdu13 -  
 M1N05 -
Bonsoir,
Je cherche à réaliser un script shell simple permettant d'afficher les fichier ayant moins de 15 jours lorsqu'on lui donne un fichier tel que celui qui suit :
$>cat Liste.txt

Rpertoire de D:\Temp\Site V2.0\Comique\Videos_Anims\Prouesses

07/03/2007 19:43 5ÿ062ÿ686 Prouesse-Jouons_aux_Des_.wmv
07/03/2007 19:45 2ÿ462ÿ529 Prouesse-Astuce-multiplication.wmv
18/03/2007 18:32 2ÿ824ÿ940 Prouesse-Bocinas.wmv
27/03/2007 11:51 2ÿ113ÿ300 Prouesse-Jongleur.wmv
02/04/2007 16:21 3ÿ048ÿ655 Prouesse-BBox.wmv
13/05/2007 18:49 2ÿ991ÿ358 Prouesse-Dance.wmv
20/05/2007 22:56 2ÿ932ÿ550 Prouesse-Les_Nichons_en_Folie__1.wmv
05/06/2007 21:05 2ÿ976ÿ312 Prouesse-Camera_speed.wmv
07/06/2007 19:12 1ÿ464ÿ184 Prouesse-SuperBeetle.wmv
07/06/2007 19:14 993ÿ480 Prouesse-Chambre.wmv
23/06/2007 12:55 810ÿ612 Prouesse-Berlusconi.wmv
23/06/2007 12:55 282ÿ024 Prouesse-Crotte_de_nez.wmv
07/07/2007 18:06 3ÿ549ÿ703 Prouesse-Bruce Lee.wmv
13/07/2007 12:49 5ÿ049ÿ313 Prouesse-Magie.wmv
13/07/2007 12:54 2ÿ214ÿ082 Prouesse-Skate_record.wmv
18/08/2007 02:02 811ÿ076 Regis_Le_chien_de_Regis.mpg
18/08/2007 02:02 487ÿ428 Regis-Pere_football.mpg
18/08/2007 02:02 995ÿ346 Regis-Sex_Grand-parents.wmv
24/08/2007 00:50 148ÿ480 Thumbs.db
36 fichier(s) 81ÿ267ÿ285 octets

Total des fichiers listsÿ:
xxx fichier(s) 971ÿ464ÿ460 octets
0 Rp(s) 3ÿ894ÿ640ÿ640 octets libres
Pour n'afficher que le nom du fichier je me débrouille via un awk mais mon problème est pour compter les 15 jours qui précèdent lorsque ça passe au mois précédent ou pire à l'année précédente (genre la date actuelle est le 03/01/2008 et je veux afficher les fichiers entre le 19/12/2007 et cette date)

Voilà si quelqu'un manipule avec dextérité les dates je l'en remercie...

9 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Il eût été plus simple de faire la recherche directement sur le répertoire (d'origine) contenant les fichiers, mais bon...

    Voilà un bout de code commenté, en espérant qu'il fasse ce que tu espères :
    #! /bin/bash
    
    # Décommenter pour débuguer le script
    #set -xv
    
    # Récupération date référence
    var_date=$(date "+%Y/%m/%d" --date "-15 days")
    # Transformation en valeur "epoch"
    var_butoir=$(date --date "$var_date" +%s)
    
    # Boucle sur le fichier
    while read ligne
    do
    # On teste si la ligne commence par 2 chiffres suivis d'un slash
    if egrep -o "^[0-9]{2}/" <<<"$ligne" >/dev/null
    then
            # On récupère la date qui est sous la forme jj/mm/yyyy
            valeur_brute=$(awk -F" " '{ print $1 }' <<<"$ligne")
            # On la transforme en yyyy/mm/jj
            valeur=$(echo "$valeur_brute" | sed 's|\(..\)/\(..\)/\(.*\)|\3/\2/\1|')
            # Transformation en valeur "epoch"
            valeur_epoch=$(date --date "$valeur" +%s)
            # On compare les 2 valeurs et si la valeur est supérieure ou égale
            if [ "$valeur_epoch" -ge "$var_butoir" ]
            then
                    echo "$ligne"   # On l'affiche (toi tu fais ce que tu veux)
            fi
    else
            # Si la ligne ne commence pas par 2 chiffres suivis d'un slash
            #+ On saute à la ligne suivante
            continue
    fi
    done < fichier
    ;-))
    0
  2. MArsdu13
     
    Merci mille fois, cela marche parfaitement !!!
    Je peux en profiter pour te demander comment (si tu as le temps) tu fais pour remplacer des \ par des / car je bute sur ce nouveau problème, j'essaye avec sed mais ça ne fonctionne pas :
    echo Rpertoire de D:\Temp\Site V2.0\Comique\Videos_Anims\Prouesses|sed -e "s/\\/\//g"
    En fait je découvre simplement que sed ne voit pas mes \ dans la chaine donnée en entré...

    Merci si tu connais une astuce !
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    echo "20\10\2007" | sed 's|\\|/|g'
    20/10/2007
    ;-))
    0
  4. MArsdu13
     
    Trop rapide, merci, mon problème venait aussi du fait que je faisais un echo 20\10\2007 | sed 's|\\|/|g' et sans les " ça ne me donnait rien...
    Des reflexes à prendre heureusement qu'il y a de l'aide !!!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Ça viendra ;-))
    0
  7. MArsdu13
     
    Bon voilà j'ai un peu peaufiné le script que tu m'as concocté pour qu'il corresponde mieux à ce que je veux (je ne voulais pas trop t'en demander d'un coup !) mais à nouveau un petit problème de / : je colle ici juste le début du fichier, en fait mon problème est que dès le départ le read ligne n'affiche pas les / car en plus de la liste des fichiers comme vu lors de ma première question un path vers les fichiers est précisé et je voudrais l'utiliser :
    Voilà le script :
    #! /bin/bash

    # Décommenter pour débuguer le script
    set -xv

    # Récupération date référence
    var_date=$(date "+%Y/%m/%d" --date "-15 days") # Transformation en valeur "epochh
    "
    var_butoir=$(date --date "$var_date" +%s)

    # Boucle sur le fichier
    while read ligne
    do
    if egrep "pertoire" <<< "$ligne" >/dev/null
    then

    echo $ligne

    Et là au lieu de m'afficher : Rpertoire de D:\Temp\Site V2.0\Comique\Videos_Anims\Prouesses
    il m'affiche : Rpertoire de D:TempSite V2.0ComiqueVideos_AnimsProuesses
    ????
    0
  8. MArsdu13
     
    Je viens de trouver : il suffit de faire read -r
    !!!!!
    Désolé
    0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-
    while read -r ligne 
    Ça permet de ne pas prendre en compte le "\" qui est normalement un caractère d'échappement et donc de le percevoir sous sa forme littérale.

    ;-)
    0
  10. M1N05
     
    Sinon, une autre solution assez élégante, reposant sur la comparaison de date entre fichiers se trouve là:
    http://www.lea-linux.org/cached/index/Trucs:Travailler_sur_un_ensemble_de_fichiers.html

    En gros, creation d'un fichier à la date voulue, puis on "find" tous les fichiers plus récents que celui ci

    Pas compliqué !
    0