Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/02/2012, à 20:34

arnaud94

Script LFTP

Bonjour,

J'ai fait un petit script de sauvegarde avec upload sur le FTP et la purge qui va avec.
Pour cela j'utilise lftp.
Aucun souci pour l'upload, le probleme se trouve plutot au niveau de la purge:

Je recupere la liste des fichiers présents sur le FTP, puis j'identifie ceux de mes sauvegardes.
Puis pour chacun des fichiers de la liste, j'extrait la date du nom et je compare à la date de retention que j'ai calculé.
Si le fichier est plus ancien, je l'efface.Le probleme réside dans le fait que dès le 1er fichier à purger est purgé, il sort de la boucle completement et ne regarde pas les fichiers suivants de la liste.
Ce qui fait qu'il peut effacer 1 seul fichier à la fois.
J'ai fait differents tests, sauvegarde des echanges ftp, etc... et le probleme vient bien de lftp lors de l effacement.

J'aimerais savoir comment résoudre ce problème
Voici une copie du code concerné:


do_FTPPurge()
{
        echo "`date +%Y/%m/%d_%Hh%M` Debut de la purge FTP" >> $LOGFILE
        date_retention=`date +%Y%m%d --date "$RETENTION days ago"`
        echo "Date de retention calculee: $date_retention " >> $LOGFILE
        PURGE_FILE=/tmp/ftppurge.txt
        lftp ftp://$LOGIN_FTP:$PASS_FTP@$HOST_FTP -e "cd $DIR_FTP;ls" > $PURGE_FILE
        prefix=$MACHINE"_BACKUP_"
        grep $prefix $PURGE_FILE | while read ligne
        do
              fichier=`echo $ligne | rev | cut -d ' ' -f1 | rev`
              date=${fichier:13:8}
              echo "Fichier $fichier -> $date" >> $LOGFILE
             if [ $date -lt $date_retention ]
             then
               echo "Fichier a supprimer $fichier" >> $LOGFILE
               lftp ftp://$LOGIN_FTP:$PASS_FTP@$HOST_FTP -e "cd $DIR_FTP;rm $fichier" >> $LOGFILE
                echo "Fichier $fichier supprime" >> $LOGFILE
                fi
        done
        echo "`date +%Y/%m/%d_%Hh%M` Fin de la purge FTP" >> $LOGFILE
}

Merci beaucoup

Dernière modification par arnaud94 (Le 12/02/2012, à 22:28)

Hors ligne

#2 Le 12/02/2012, à 23:48

sputnick

Re : Script LFTP

Salut, donne un exemple de nom de fichier STP.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#3 Le 13/02/2012, à 08:55

arnaud94

Re : Script LFTP

Salut.
Par exemple

tarja_BACKUP_201112130300.tar.gz

Hors ligne

#4 Le 13/02/2012, à 09:21

sputnick

Re : Script LFTP

Il faut juste que tu ajoute quit dans tes commandes lftp, par exemple:

lftp ftp://$LOGIN_FTP:$PASS_FTP@$HOST_FTP -e "cd $DIR_FTP; rm $fichier; quit"

Testé OK

Edit: Marrant ton utilisation d'un double rev smile
Tu pourrais utiliser à la place

awk '{print $NF}'

pour afficher la dernière colonne à la place de

fichier=`echo $ligne | rev | cut -d ' ' -f1 | rev`

Sinon, les `` sont dépréciés en faveur de cette forme : $( )

et puis la forme [[ ]] est plus puissante que la forme [ ]. On peut aussi utiliser la forme arithlmetique :

if ((date < date_retention)); then ...

Voilà pour mes recommandations wink

Dernière modification par sputnick (Le 13/02/2012, à 09:32)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#5 Le 13/02/2012, à 09:51

pingouinux

Re : Script LFTP

Salut,
Je me demande si dans cette ligne :

lftp ftp://$LOGIN_FTP:$PASS_FTP@$HOST_FTP -e "cd $DIR_FTP;ls" > $PURGE_FILE

il ne faudrait pas remplacer ls par ls -1 pour n'avoir qu'un fichier par ligne dans $PURGE_FILE

Hors ligne

#6 Le 13/02/2012, à 10:22

sputnick

Re : Script LFTP

Bonne idée pingouinux, tout à fait, bien vu.

Edit: on peux même lancer ce genre de commandes :

ls -1 | grep BACKUP | grep -oP '[0-9]+'

pour récupérer les dates des fichiers et utilliser

mrm *20120213*

par exemple pour effacer.

Dernière modification par sputnick (Le 13/02/2012, à 10:36)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#7 Le 13/02/2012, à 11:33

Postmortem

Re : Script LFTP

pingouinux a écrit :

Salut,
Je me demande si dans cette ligne :

lftp ftp://$LOGIN_FTP:$PASS_FTP@$HOST_FTP -e "cd $DIR_FTP;ls" > $PURGE_FILE

il ne faudrait pas remplacer ls par ls -1 pour n'avoir qu'un fichier par ligne dans $PURGE_FILE

Salut,
J'ai l'impression que dès que l'on redirige la sortie de ls vers un fichier, le -1 est implicite. Du moins, ça fonctionne comme ça chez moi.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#8 Le 13/02/2012, à 11:41

sputnick

Re : Script LFTP

Postmortem a écrit :

J'ai l'impression que dès que l'on redirige la sortie de ls vers un fichier, le -1 est implicite. Du moins, ça fonctionne comme ça chez moi.

Nope, pas sous archlinux + lftp 4.3.5 en tout K.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#9 Le 13/02/2012, à 11:46

pingouinux

Re : Script LFTP

@Postmortem #7 : Tu as raison, je viens de vérifier. J'ignorais ce comportement inattendu.
GNU bash, version 4.2.8(1)-release (x86_64-pc-linux-gnu)

Ajouté :
Voici un extrait de info ls

`-1'
`--format=single-column'
     List one file per line.  This is the default for `ls' when standard
     output is not a terminal.

Dernière modification par pingouinux (Le 13/02/2012, à 12:07)

Hors ligne

#10 Le 17/02/2012, à 11:30

arnaud94

Re : Script LFTP

Merci beaucoup pour votre aide.
Effectivement le "QUIT" a corrigé le problème. Merci

Pour les différentes autres choses: oui j'ai utilisé le REV car je connais très mal AWK et j'évite de l'utiliser.
En revanche, je m'aperçois que mes connaissances en shell sont un peu dépassées car j'utilise des fonctions dépréciées sad
Si quelqu'un a un doc de mise à jour de toutes ces fonctions depréciées, ce serait cool.

En revanche, en ce qui concerne ceci:

et puis la forme [[ ]] est plus puissante que la forme [ ]. On peut aussi utiliser la forme arithlmetique :
if ((date < date_retention)); then ...

Euh si quelqu'un pouvait m expliquer pourquoi c est mieux ... smile
Merci

Hors ligne

#11 Le 17/02/2012, à 15:47

Postmortem

Re : Script LFTP

Salut,
[ : est une commande (que l'on termine avec ] ) synonyme de la commande test
[[ et ]] : sont des mots réservés du shell.

Il y a aussi des différences à l'utilisation ; par exemple, entre les double-crochets, il n'y a pas de développement des chemins (avec * par exemple) :

$ mkdir /tmp/test; cd /tmp/test
$ touch fic1.txt
$ [ -f *.txt ] && echo "Il y a un fichier *.txt"
Il y a un fichier *.txt
$
$ [[ -f *.txt ]] && echo "Il y a un fichier *.txt"
$

Les double parenthèses servent à faire des calculs ou des comparaisons d'entiers.

Rajout :
Autre différente entre simple et double crochets ; avec les double crochets, on peut comparer une variable avec un "pattern" et on est pas obligé de protéger le développement d'une variable qui pourrait contenir des espaces :

$ var=texte
$ [ $var = *e ] && echo OK
$ 
$ [[ $var = *e ]] && echo OK
OK
$
$ var='texte avec espaces'
$ [ $var = *espaces ] && echo OK
bash: [: trop d'arguments
$ [ "$var" = *espaces ] && echo OK
$ [[ $var = *espaces ]] && echo OK
OK
$

Dernière modification par Postmortem (Le 17/02/2012, à 16:00)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#12 Le 17/02/2012, à 17:10

sputnick

Re : Script LFTP

greybot du cannal IRC #bash sur freenode nous apprend :

greybot a écrit :

[16:09] <greybot> [[ is a bash keyword similar to (but more powerful than) the [ command. See http://mywiki.wooledge.org/BashFAQ/031 and http://mywiki.wooledge.org/BashGuide/Te … nditionals. Unless you're writing for POSIX sh, we recommend [[.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#13 Le 25/06/2012, à 11:04

koff

Re : Script LFTP

De mon coté, le processus lftp tourne en boucle alors que le script est arrêté, il mange un peu trop de CPU bizarrement ...
Par ailleurs, je me demande comment appeler sa fonction, car elle ne fait que lister les fichiers du serveur ?

Hors ligne