Pages : 1
#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
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
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
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
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
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 ...
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 :
[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
Pages : 1