OVH Cloud OVH Cloud

Suppression d'anciens fichiers sous FTP

1 réponse
Avatar
david.claveau
Bonjour,
Voici mon probl=E8me : Je souhaite supprimer des fichiers anciens
(disons vieux de 15 jours) sur un site FTP.
Je ne peux m'y connecter qu'en FTP.
Le serveur est sous Linux, et je peut avoir acc=E8s =E0 la librairie
NCFTP (dont le ncftpls qui me permet de lister facilement toute
l'arborescence du serveur).
L'id=E9e est donc de r=E9cup=E9rer la date du jour, de calculer - 15
jours, de lister les fichiers du site (en FTP) pour filtrer les trop
vieux et de les supprimer (=E7a fait beaucoup).
Sans fichier temporaire c'est mieux, un script qui pipe l'entr=E9e d'une
commande vers une autre, sinon, avec c'est bien aussi.
J'aimerai le faire en script shell, mais je suis preneur d'autres
langages (python ?).

Merci d'avance.

1 réponse

Avatar
Joe Linux

Bonjour,
Voici mon problème : Je souhaite supprimer des fichiers anciens
(disons vieux de 15 jours) sur un site FTP.
Je ne peux m'y connecter qu'en FTP.
Le serveur est sous Linux, et je peut avoir accès à la librairie
NCFTP (dont le ncftpls qui me permet de lister facilement toute
l'arborescence du serveur).


Le problème reside dans la conversion de la date renvoyée par ncftpls
en un timestamp :

ncftpls -R -u user -p motdepasse ftp://host/ | awk ' BEGIN { path="";
file=""; p=0 } { if($1 ~ "^./") { path=$1;}; if ($1 ~ "^-") {file = $9
; date = $6" "$7" "$8 ; p=1} ; if(p==1) {print path" "file" "date;};
p=0 }' | sed -e 's/: ///g'

devrait te donner la liste dans un format utilisable, comme
./chemin/fichier Mon DD YYYY
ou
./chemin/fichier Mon DD hh:mm

Reste à le piper dans un truc qui transforme cette date en timestamp
(sachant que dans le premier cas, le fichier est forcément vieux de
plus d'un an, donc, à effacer) et voir si ce timestamp est inférieur
de plus de 15 x 86400 secondes à l'actuel;

Et ensuite avec des guillemets inversés,

for FILE in `commande`; do ncftp .... ; done

Par contre j'ai pas de solution miracle pour transformer la date en
timestamp; En php (en ligne de commande) ca pourrait se faire avec :


ncftpls -R -u user -p motdepasse ftp://serveur/ | awk ' BEGIN {
path=""; file=""; p=0 } { if($1 ~ "^./") { path=$1;}; if ($1 ~ "^-")
{file = $9 ; date = $6"_"$7"_"$8 ; p=1} ; if(p==1) {print path" " file"
"date;}; p=0 }' | sed -e 's/: ///g' | /usr/local/bin/php -nq -r
'$timestamp=mktime()-(15*86400); $array = file("php://stdin");
while(list($key, $val) = each($array)) { $tmp = explode(" ", $val);
$date_file=strtotime(ereg_replace("_", " ", $tmp[1])); if($date_file <
$timestamp) { echo $tmp[1]." ".$tmp[0]." a effacer...n";} else {echo
$tmp[1]." ".$date_file." < $timestamp a conserver...n";}} '

Ca demanderai du test, mais au moins, il y a plusieurs langage
differents : awk, sed, php...
Je fais l'hypothese que le client est aussi sous linux...
Evidement on peut rassembler tout dans un fichier pour le rendre plus
lisible :
!/usr/bin/bash

ncftpls -R -u user -p motdepasse ftp://serveur/ | awk '
BEGIN {
path="";
file="";
p=0
}
{
if($1 ~ "^./") {
path=$1;
};
if ($1 ~ "^-") {
file = $9 ;
date = $6"_"$7"_"$8 ;
p=1
};
if (p==1) {
print path" "file" "date;
};
p=0
}' | sed -e 's/: ///g' | /usr/local/bin/php -nq -r '
$timestamp = mktime()-(15*86400);
$array = file("php://stdin");
while(list($key, $val) = each($array)) {
$tmp = explode(" ", $val);
$date_file = strtotime(ereg_replace("_", " ", $tmp[1]));
if($date_file < $timestamp) {
echo $tmp[1]." ".$tmp[0]." a effacer...n";
} else {
echo $tmp[1]." ".$date_file." < $timestamp a conserver...n";
}
}'

Cordialement,