9
votes

Script Shell Linux pour supprimer les anciens fichiers de FTP

Il y a un problème - Besoin de stocker la sauvegarde de la base de données sur le FTP. Sur le FTP ne doit pas dépasser 10 sauvegères, c'est-à-dire après avoir ajouté que la sauvegarde à FTP doit être supprimée, les fichiers les plus anciens pour rendre le nombre total de fichiers ne peuvent pas dépasser 10 pièces. Comment pouvons-nous mettre en œuvre un tel retrait du FTP? J'essaie d'écrire un script, mais ne fonctionne pas Supprimer: xxx


0 commentaires

5 Réponses :


-5
votes

N'utilisez pas FTP (pour de nombreuses raisons). Cependant, si vous faites cela dans SSH, vous obtenez un TTY, un environnement et tout le reste. De plus, si vous souhaitez que un fichier de 10 jours soit supprimé (et non un 10 jours calendrier, sale) Un simple Recherche -Mtime +10 -Delete code> remplacerait cela pour la boucle. Ainsi:

ssh user@host 'find $DIR -mtime +10 -delete'


0 commentaires

13
votes

Ceci est un script que j'ai écrit pour supprimer tous les fichiers sur un site FTP distant de plus de 7 jours. Il fonctionne en récupérant une liste du répertoire, à l'analyse de la date modifiée, puis à nouveau à supprimer tous les fichiers plus âgés que les ndays.

Je soupçonne que les chiffres codés dur dans la boucle (la date d'élément) peuvent changer en fonction de la configuration de votre système. La mise en forme de retour de la commande LS dépend des paramètres du système local. P>

supposant que vos sauvegardes sont tous les jours, puis réglage Ndays à 10 pourrait résoudre votre problème. P>

#!/bin/bash
# get a list of files and dates from ftp and remove files older than ndays
ftpsite="ftp.yourserver.com"
ftpuser="loginusername"
ftppass="password"
putdir="/public_ftp/admin/logs"

ndays=7


# work out our cutoff date
MM=`date --date="$ndays days ago" +%b`
DD=`date --date="$ndays days ago" +%d`


echo removing files older than $MM $DD

# get directory listing from remote source
listing=`ftp -i -n $ftpsite <<EOMYF 
user $ftpuser $ftppass
binary
cd $putdir
ls
quit
EOMYF
`
lista=( $listing )

# loop over our files
for ((FNO=0; FNO<${#lista[@]}; FNO+=9));do
  # month (element 5), day (element 6) and filename (element 8)
  #echo Date ${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]}          File: ${lista[`expr $FNO+8`]}

  # check the date stamp
  if [ ${lista[`expr $FNO+5`]}=$MM ];
  then
    if [[ ${lista[`expr $FNO+6`]} -lt $DD ]];
    then
      # Remove this file
      echo "Removing ${lista[`expr $FNO+8`]}"
      ftp -i -n $ftpsite <<EOMYF2 
      user $ftpuser $ftppass
      binary
      cd $putdir
      delete ${lista[`expr $FNO+8`]}
      quit
EOMYF2


    fi
  fi
done


4 commentaires

Très agréable! Mais pourquoi déconnectez-vous et reconnectez-vous entre des fichiers? Laissez la connexion ouverte.


Grand script merci :) Mais j'ai une erreur "Valeur trop grande pour la base (jeton d'erreur est" 08 ")" Lorsque $ DD est 0x il est interprété comme x en octal (problème pour 8 et 9)


Supprimer des fichiers plus âgés que JUL 06 EMPRESS DATE FTP 12672814 Fichier FTP 12672813 Fichier: 1 Date FTP 12672913 Fichier: 1 Date FTP 12672913 Fichier: 7 Date FTP 1099121178 Fichier: 7 Date FTP 1099121165 Fichier: 1 Date FTP 1099121206 Fichier: 7 Date de date: Supprimer Essayer 62.210.17.5 ... (Fichier distant) Impossible de supprimer Quitter: Aucun fichier ou répertoire de ce type


Je vois un bug ici! Peut-être que mon mauvais, mais si le mois de changement de mois, par exemple 5 sept et 7 jours avant le 29 août, les nouvelles sauvegardes supprimeront dans ces conditions! tt = date --Date = "$ ndnays il y a des jours" +% s``` est une meilleure condition



5
votes

Celui-ci traite de SFTP et dispose d'une vérification de la date appropriée car le script de @graeme fonctionne seulement dans un mois:

#!/bin/bash
# get a list of files and dates from ftp and remove files older than ndays
ftpsite="sftp -b-  -oIdentityFile=<KEYFILE> -oPort=<PORT>  <USER>@<HOST>"
putdir="/data"

ndays=19

# work out our cutoff date
MM=`date --date="$ndays days ago" +%b`
DD=`date --date="$ndays days ago" +%d`
TT=`date --date="$ndays days ago" +%s`

echo removing files older than $MM $DD

# get directory listing from remote source
echo "
cd $putdir
ls -l
"|$ftpsite >dirlist

# skip first three and last line, ftp command echo
listing="`tail -n+4 dirlist|head -n-1`"

lista=( $listing )

# loop over our files
for ((FNO=0; FNO<${#lista[@]}; FNO+=9));do
  # month (element 5), day (element 6) and filename (element 8)
  # echo Date ${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]}          File: ${lista[`expr $FNO+8`]}

  fdate="${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]} ${lista[`expr $FNO+7`]}"
  sdate=`date --date="$fdate" +%s`
  # check the date stamp
  if [ $sdate -lt $TT ]
  then
      # Remove this file
      echo "$MM $DD: Removing  ${lista[`expr $FNO+5`]} /  ${lista[`expr $FNO+6`]} / ${lista[`expr $FNO+8`]}"
      $ftpsite <<EOMYF2
      cd $putdir
      delete ${lista[`expr $FNO+8`]}
      quit
EOMYF2

  fi
done


0 commentaires

0
votes

Voici une solution plus courte utilisant lftp , qui fonctionnera également avec des sous-répertoires: xxx

Il a deux inconvénients cependant:

  • Il va d'abord télécharger ces anciens fichiers (avant de les supprimer plus tard), il utilise donc une autre bande passante
  • Ces anciens fichiers prendront de l'espace sur le disque local avant d'être supprimés. Vous pouvez utiliser NULLFS sur Pally à celui

0 commentaires

1
votes

Il a passé plusieurs années et, tandis que La réponse de Graeme m'a aidé mais je suis confronté à certains problèmes et voici comment Pour les réparer.

Parfois, la phrase comme Essayer AAAA: BBB: CCC: DDDD :: 0 ... code> est à la première ligne de la liste code> Varable. Vous devez le supprimer. P>

MM=$(tr -dc '0-9' <<< $MM)
DD=$(tr -dc '0-9' <<< $DD)
MM=${MM#0}
DD=${DD#0}


0 commentaires