Récup de fichiers récents via script shell

[Résolu/Fermé]
Signaler
-
 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

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
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
;-))
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 !
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
echo "20\10\2007" | sed 's|\\|/|g'
20/10/2007
;-))
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 !!!
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
Ça viendra ;-))
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
????
Je viens de trouver : il suffit de faire read -r
!!!!!
Désolé
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
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.

;-)
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é !