2008-11-21 6 views
1

Je lance un serveur OpenSuse qui télécharge des sauvegardes de code source zippées sur un serveur FTP Microsoft chaque nuit. J'ai écrit un script Bash qui le fait à travers un travail cron.Comment supprimer des fichiers de plus de N semaines d'un serveur FTP Microsoft

Je souhaite supprimer les fichiers sauvegardés antérieurs à une certaine date. Comment pourrais-je faire ça?

+0

Je suggère fortement d'ajouter la date de la sauvegarde au nom du fichier de sauvegarde, en particulier si le serveur FTP est hébergé par un tiers. Si quelque chose gâche les temps de fichier, vous risquez de supprimer accidentellement les mauvais fichiers. –

+0

Je fais! C'est un nom de fichier typique - factory-hotcopy-Fri-14-Nov-2008-Rev574.zip. Je calcule également un md5 sur le fichier zip qui est stocké avec lui dans un fichier texte d'accompagnement. –

+0

Si vous pouvez utiliser Python, s'il vous plaît voir [this] (http://stackoverflow.com/questions/2867217/how-to-delete-files-with-a-python-script-from-a-ftp-server-which -are-plus-que-7/3114477 # 3114477) répondre dans une question connexe. – tzot

Répondre

1

Vous pouvez supprimer des fichiers sur le serveur FTP à l'aide des commandes FTP delete ou mdelete. Je ne connais pas un moyen de sélectionner les anciens fichiers comme une opération côté serveur, donc une option serait de faire un FTP ls pour obtenir une liste des fichiers sur le serveur, puis analyser la sortie pour ramasser les fichiers qui sont plus anciens que votre date spécifiée. Puis supprimez chacun en utilisant une commande FTP.

Si vous avez une copie locale de tous les fichiers, il est probablement plus facile de générer localement la liste des fichiers en utilisant find puis de les supprimer un par un du serveur.

Si vous avez un certain contrôle sur le serveur FTP, alors utiliser rysnc au lieu de FTP serait probablement plus facile.

1

Le tableau suivant supprime tous les fichiers sous l'arborescence des répertoires racine à dir dont la dernière date de modification est antérieure au 1er Novembre:

find dir -type f \! -newermt 2008-11-01 -exec rm '{}' \+ 

La date/format de l'heure devrait être ISO 8601; Je ne sais pas si d'autres formats sont acceptés.

+0

Le serveur que j'utilise ne semble pas prendre en charge la commande "Find" - du message d'accueil, il semble que ce soit NcFTPd. Est-ce juste une commande que l'administrateur n'a pas activée, ou y at-il autre chose que je peux utiliser? – SqlRyan

1

Malheureusement, la suppression de vieux fichiers d'un serveur FTP n'est pas aussi simple que l'exécution de find. -mtime +30 -delete car généralement vous n'obtenez pas d'accès shell à votre espace FTP. Tout doit être fait via FTP.

Here vient un simple script Perl qui fait l'affaire. Il nécessite le module Net::FTP.

+0

Merci beaucoup - c'est exactement ce que je cherchais. –

1
/******************************************************************************************* 
* Author: Kevin Osborne 
* This java app aims to delete non-empty directories from an FTP server that are older than 
* 45 days, the 45 can be changed to whatever. I believe it's recursive, but I've only tried 
* with 3 levels deep, so I can't guarantee anything beyond that, but it worked for my needs 
* and hopefully it will for yours, too. 
* 
* It uses ftp4j, which I found to be incredibly simple to use, though limited in some ways. 
* feel free to use it, I hope it helps. ftp4j can be downloaded as a jar file here: 
* http://www.sauronsoftware.it/projects/ftp4j/ just include it in your IDE. 
*******************************************************************************************/ 


package siabackupmanager; 

import java.util.Calendar.*; 
import java.util.*; 
import it.sauronsoftware.ftp4j.*; 

public class SIABackupManager { 

    // @SuppressWarnings("static-access") 
    public static void main(String[] args) { 
    if (args.length != 3) { 
     System.out.println("Usage: java -jar SIABackupManager.jar HOST USERNAME PASSWORD"); 
     System.exit(0); 
    } 
    try { 
     FTPClient client = new FTPClient(); 
     String hostname = args[0]; 
     String username = args[1]; 
     String password = args[2]; 

     client.connect(hostname); 
     client.login(username, password); 

     FTPFile[] fileArray = client.list(); 

     for (int i = 0; i < fileArray.length; i++) { 


      FTPFile file = fileArray[i]; 
      if (file.getType() == FTPFile.TYPE_DIRECTORY) { 

       java.util.Date modifiedDate = file.getModifiedDate(); 
       Date purgeDate = new Date(); 
       Calendar cal = Calendar.getInstance(); 
       cal.add(Calendar.DATE, -45); 
       purgeDate = cal.getTime(); 

       if (modifiedDate.before(purgeDate)) { 

         String dirName = file.getName(); 
         deleteDir(client, dirName); 
         client.changeDirectoryUp(); 
         client.deleteDirectory(dirName); 
       } 
      } 
     } 
    } catch(Exception ex) { System.out.println("FTP error: " + ex.getMessage()); } 
    } 

    public static void deleteDir(FTPClient client, String dir) { 
     try { 
      client.changeDirectory(dir); 
      FTPFile[] fileArray = client.list(); 
      for (int i = 0; i < fileArray.length; i++) { 
       FTPFile file = fileArray[i]; 
       if (file.getType() == FTPFile.TYPE_FILE) { 
        String fileName = file.getName(); 
        client.deleteFile(fileName); 
       } 
      } 
      for (int i = 0; i < fileArray.length; i++) { 
       FTPFile file = fileArray[i]; 
       if (file.getType() == FTPFile.TYPE_DIRECTORY) { 
        String dirName = file.getName(); 
        deleteDir(client, dirName); 
        client.changeDirectoryUp(); 
        String currentDir = client.currentDirectory(); 
        client.deleteDirectory(dirName); 
       } 
      } 
     } catch (Exception ex) { System.out.println("deleteDir error: " + ex.getMessage()); } 
    } 
} 
Questions connexes