![]() |
| 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é. | |||||||
|
|||||||
| Shell Vos questions sur l'utilisation des commandes shell |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Invité régulier
![]() Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
|
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 ? |
|
|
|
|
|
#2 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
|
Bonjour,
C'est pas très clair:
|
|
|
|
|
|
#3 (permalink) |
|
Invité régulier
![]() Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
|
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. |
|
|
|
|
|
#5 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
|
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
|
|
|
|
|
|
#6 (permalink) |
|
Membre Expert
![]() |
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 {} \;
Un petit "man find" te donnera tous les paramètres de cette commande fort utile. |
|
|
|
|
|
#7 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
|
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. |
|
|
|
|
|
#8 (permalink) |
|
Invité régulier
![]() Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
|
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 |
|
|
|
|
|
#9 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
|
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
|
|
|
|
|
|
#10 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
|
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é.
|
|
|
|
|
|
#12 (permalink) |
|
Invité régulier
![]() Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
|
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 |
|
|
|
|
|
#13 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 272
|
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. |
|
|
|
|
|
#14 (permalink) |
|
Membre éclairé
![]() Date d'inscription: mars 2002
Localisation: Martigny, VS, CH
Âge: 23
Messages: 339
|
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).
__________________
Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/ |
|
|
|
|
|
#15 (permalink) | |
|
Invité régulier
![]() Date d'inscription: novembre 2008
Localisation: Annecy
Âge: 30
Messages: 10
|
Citation:
Peux tu m'expliquer la fonction des variables $3 ; $2 ; $1 ET pourquoi on divise par 86400 ? merci |
|
|
|
|
|
![]() |
![]() |
||
Aide de demarrage sur un script perso
|
||
| Outils de la discussion | |
|
|