Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Applications > Shell

Shell Vos questions sur l'utilisation des commandes shell

Réponse
 
Outils de la discussion
Vieux 13/11/2008, 22h24   #1 (permalink)
Invité régulier
 
Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
Par défaut Aide de demarrage sur un script perso

Bonjour,

Je vous sollicite pour vous demander une aide sur mon script :

Je souhaite que mon script supprime un dossier de plus de 31 jours à partir de la date de creation du dossier en question.

Dites moi si je fais fausse route dans la construction :

les dossiers sous sous cette forme :
|
| jours |
-----------| 10-11-2008
-----------| 11-11-2008
-----------| 12-11-2008

* j'affiche la date du jour
* j'extrais la date du jour en prenant le nombre du jour en variable (a)
* je liste le contenu du dossier jours en faisant une boucle (for)
* je mets en variable (b) la liste
* j'extrais le nombre du jour (qui etait le nom du dossier) en variable (c)
* avec une condition : si c + 31 > a alors supprimer le dossier

Est-ce que ma théorie est bonne ? ou y a t-il plus simple ?
74manu74 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 11h40   #2 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
Par défaut

Bonjour,

C'est pas très clair:
  • j'affiche la date du jour --> pourquoi pas.
  • j'extrais la date du jour en prenant le nombre du jour en variable (a) --> gni? Si on est le 14 nov, tu récupères 14, c'est ça?
  • je liste le contenu du dossier jours en faisant une boucle (for) --> pourquoi pas faire un ls ou un echo *?
  • je mets en variable (b) la liste --> dans la même commande que la ligne précédente.
  • j'extrais le nombre du jour (qui etait le nom du dossier) en variable (c) --> c'est la date du mois?
  • avec une condition : si c + 31 > a alors supprimer le dossier --> si a est une date dans le mois, alors la condition c + 31 > a sera (quasiment) toujours vraie puisque a <= 31.
Sans savoir exactement ce que tu fais, difficile de te donner des conseils...
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 12h21   #3 (permalink)
Invité régulier
 
Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
Par défaut

Effectivement, voici d'autres explications auquelles je reponds en italique :

J'affiche en gras, ce qui est valide, vrai et applicable.


* j'affiche la date du jour --> pourquoi pas.
* j'extrais la date du jour en prenant le nombre du jour en variable (a) --> gni? Si on est le 14-11-2008, tu récupères 14, c'est ça? Oui
* je liste le contenu du dossier jours en faisant un ls --> pourquoi pas faire un ls ou un echo *? oui, un ls
* je mets en variable (b) la liste --> dans la même commande que la ligne précédente.
* j'extrais le nombre du jour de la variable (b) et je cree la variable (c) qui correspond au jour : exemple : pour le dossier 12-11-2008 ; la variable (c) sera 12 --> c'est la date du mois?
* Je dis alors avec une condition : si c + 31 < a alors ne pas supprimer le dossier sinon le supprimer --> si a est une date dans le mois, alors la condition c + 31 > a sera (quasiment) toujours vraie puisque a <= 31.
exemple sur ce dernier point : si c (12, dans mon exemple) + 31 < a (14, dans notre exemple)

Exact ; dans un cas ou dans l'autre ; çà ne marche pas ; je pense qu'il faut que je recupere aussi la variable du mois et mettre une sous condition.
74manu74 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 13h28   #4 (permalink)
Modérateur
 
Avatar de ggnore
 
Date d'inscription: juillet 2004
Localisation: Made in normandy
Âge: 30
Messages: 2 139
Par défaut

Tu peux utiliser find -exec sinon
http://man.developpez.com/man1/find.1.php
__________________
Donne un poisson à un homme et tu le nourris pour un jour,
Apprends-lui à pêcher et tu le nourris pour toujours.
ggnore est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 13h56   #5 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
Par défaut

Il ne faut pas ré-inventer la roue. Comme c'est un nombre de jours depuis maintenant, comme l'a dit ggnore, la commande find peut faire ça très bien.
Code :
if [ "$(find dir -daystart -atime +31)" = "" ]
then
    echo "Fichiers trop jeunes"
else
    rm -rf dir
fi
J'imagine qu'il faudra paramétrer dir.
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 14h08   #6 (permalink)
Membre Expert
 
Date d'inscription: octobre 2005
Localisation: Saint-Martin de Boscherville
Âge: 29
Messages: 1 394
Envoyer un message via MSN à iohack
Par défaut

comme l'a dit ggnore, le paramètre exec de la commande find simpifie la tâche.
Exemple :
Code :
find /home/user -type d -mtime +31 -exec rm -rf {} \;
Cette commande supprimera tous les réperoires à partir de "/home/user" de plus de 31 jours.
Un petit "man find" te donnera tous les paramètres de cette commande fort utile.
iohack est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 14h22   #7 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
Par défaut

En relisant, je crois que le problème n'est pas bien décrit. Alors 74manu74, pourrais-tu expliquer en français ce que tu veux faire, et donner les noms des répertoires et fichiers.

Par exemple:
Dans un répertoire nommé 31, il y a des fichiers de la forme 14-11-2008. Dès que les fichiers sont plus vieux que 31 jours (nom du répertoire), alors il faut supprimer le répertoire entier.
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 15h07   #8 (permalink)
Invité régulier
 
Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
Par défaut

En effet, je vais vous réexpliquer mon besoin :

J'ai un repertoire jours dans lequel nous trouvons des repertoires du type : 10-11-2008 qui eux même contiennent des fichiers (pour mes sauvegardes). Les dossiers du type 10-11-2008 sont créés automatiquement le 10 novembre 2008 en l'occurrence. Je souhaite qu'au bout de 31 jours ; ce dossier soit supprimé du dossier jours ; de façon à ce que chaque "dossiers date" aient une rétention de 31 jours.

Après avoir regarder et pris connaissance de la fonction find ; celle-ci correspond parfaitement à mon problème. Je vais l'essayer et je vous remercie d'avance.

Dernière modification par 74manu74 ; 14/11/2008 à 15h53
74manu74 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 16h05   #9 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
Par défaut

Maintenant, ça me paraît clair. Voici une solution.
Code :
#!/bin/bash
cd jour
for dir in $(ls)
do
    echo $dir | awk -F '-' '
    {
        dateSec = mktime("$3 $2 $1 12 00 00")
        nowSec = systime()
        diffDay = (nowSec - dateSec) / 86400
        if (diffDay > 31)
        {
            system("rm -rf $0")
        }
    }'
done
Le code n'est pas testé du tout, donc il y a surement des erreurs. J'ai décomposé avec des noms que je pense clairs. J'expliquerai les détails ce weekend, pas le temps aujourd'hui.
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 16h11   #10 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
Par défaut

Attention avec la commande find: un répertoire prend la date de la dernière modif des fichiers qu'il contient. Il suffit de changer un fichier ou d'en ajouter un autre pour que le répertoire prenne cette date. Je ne l'ai lu nulle part, c'est d'expérience. Peut-être me trompé-je... Mais vu qu'un répertoire n'est qu'un fichier contenant une liste de fichiers, cela ne m'étonne qu'à moitié.
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 16h47   #11 (permalink)
Membre Expert
 
Date d'inscription: octobre 2005
Localisation: Saint-Martin de Boscherville
Âge: 29
Messages: 1 394
Envoyer un message via MSN à iohack
Par défaut

A vérifier, je n'ai pas d'unix sous la main, il y deux options permettant de différentier création et modification :
mtime
ctime

Encore une fois, c'est à vérifier.
iohack est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 17h56   #12 (permalink)
Invité régulier
 
Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
Par défaut

Je vais tester avec la fonction find et le code de jmelyn.

Je rajouterai egalement que l'utilisateur a la possibilité de restaurer ses fichiers tout seul ; et qu'il a les droits d'ecriture dans ce dossier. Donc je vais faire des essais de façon à voir si le repertoire ne change pas au niveau de la date si par hasard l'utilisateur met un fichier depuis sa restauration...
juste pour info : mon user utilise : WinScp pour faire ses restorations depuis sa machine Windows.

Je vous retiens au courant ce soir.

Edit

Le script de Jmelyn me parait bien ; cependant, je peux egalement utiliser la fonction 'find' car dans le dossier : 13-11-2008 ; j'ai toujours un repertoire nommé : reference dans lequel se trouve tous les fichiers sauvegardés.
Je confirme que lorsque je mets un fichier dans reference ; le dossier prend la nouvelle date mais pas le dossier 13-11-2008 ; donc parfait pour mon cas.


J'ai appris beaucoup de choses avec cette fonction ! merci à vous !

Dernière modification par 74manu74 ; 15/11/2008 à 00h03
74manu74 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/11/2008, 13h20   #13 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
Par défaut

Attention tout de même:

Si un utilisateur (ou même toi) crée un fichier au même niveau que le répertoire référence, alors la date du répertoire parent jj-mm-aaaa changera et la commande find ne fonctionnera plus comme prévu. Et pour trouver une telle erreur, c'est pas évident. Alors que le script utilisant awk, lui, fonctionnera toujours.
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/11/2008, 14h37   #14 (permalink)
Membre éclairé
 
Avatar de Tchetch
 
Date d'inscription: mars 2002
Localisation: Martigny, VS, CH
Âge: 23
Messages: 339
Par défaut

Bonjour,

J'ai fait un petit scripte y'a pas si longtemps qui a pour but de garder propre la poubelle réseau. C'est pas du shell, mais du perl, mais ça peut faire le travail voulu.

En fait mon serveur samba ne supprime pas les fichiers quand un utilisateur les supprimes, ils les déplacent dans un autre partage. Ce partage est prévu pour garder les fichiers durant 7 jours (et uniquement le propriétaire peut y accéder). Ce script permet donc de supprimer les fichiers plus vieux, envoyer quelques statistiques et (dans la parties commentées (je sais, c'est pas bien, mais c'est comme ça)) envoyer une liste aux utilisateurs des fichiers qu'ils ont dans la corbeille (mais ils n'en veulent pas de ces mails).

Donc si ça peut servir, il est là (avec un fichier de configuration d'exemple).
Fichiers attachés
Type de fichier : conf cleanTrash.conf (386 octets, 0 affichages)
Type de fichier : pl cleanTrash.pl (11,6 Ko, 1 affichages)
__________________
Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/
Tchetch est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/11/2008, 19h17   #15 (permalink)
Invité régulier
 
Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
Par défaut

Citation:
Envoyé par jmelyn Voir le message
Maintenant, ça me paraît clair. Voici une solution.
Code :
#!/bin/bash
cd jour
for dir in $(ls)
do
    echo $dir | awk -F '-' '
    {
        dateSec = mktime("$3 $2 $1 12 00 00")
        nowSec = systime()
        diffDay = (nowSec - dateSec) / 86400
        if (diffDay > 31)
        {
            system("rm -rf $0")
        }
    }'
done
Le code n'est pas testé du tout, donc il y a surement des erreurs. J'ai décomposé avec des noms que je pense clairs. J'expliquerai les détails ce weekend, pas le temps aujourd'hui.
Bonsoir,

Peux tu m'expliquer la fonction des variables $3 ; $2 ; $1 ET pourquoi on divise par 86400 ?
merci
74manu74 est déconnecté   Envoyer un message privé Réponse avec citation
NEWS LINUX PROFESSIONNELFAQ LINUXTUTORIELS LINUXLIVRES LINUXLINUX TVUNIXGTK+QtAPACHE

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Applications > Shell



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide