2008-11-21 34 views
1

我运行一个OpenSuse服务器,该服务器每晚将压缩的源代码备份上传到Microsoft FTP服务器。我已经写了一个Bash脚本,通过一个cron工作来完成这个任务。如何从Microsoft FTP服务器删除N周以前的文件

我想删除比特定日期早的备份文件。我怎么能这样做?

+0

我强烈建议备份的日期添加到备份文件的名称,特别是如果FTP服务器是由第三方托管。如果某些东西弄乱了文件时间,可能会意外删除错误的文件。 – 2008-11-21 05:59:12

+0

我愿意!这是一个典型的文件名 - factory-hotcopy-Fri-14-Nov-2008-Rev574.zip。 我还计算了zip文件中的md5,该文件与随附的文本文件一起存储。 – 2008-11-21 07:04:42

+0

如果您可以使用Python,请参阅[this](http://stackoverflow.com/questions/2867217/how-to-delete-files-with-a-python-script-from-a-ftp-server- which -are-7 -3114477#3114477)在相关问题中回答。 – tzot 2010-06-24 22:59:15

回答

1

您可以使用delete或mdelete FTP命令删除FTP服务器上的文件。我不知道选择旧文件作为服务器端操作的方法,因此一种选择是使用FTP来获取服务器上的文件列表,然后解析输出以获取这些文件比指定的日期更早。然后使用FTP命令删除每一个。

如果您有所有文件的本地副本,那么使用find在本地生成文件列表可能更容易,然后从服务器上一次删除它们。

如果你有一些FTP服务器的控制权,那么使用rysnc而不是FTP可能会更容易。

1

下删除在根的目录树中的所有文件目录其最后修改时间是11月1日之前:

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

的日期/时间格式应该是ISO 8601;我不知道是否接受其他格式。

1

不幸的是,从FTP服务器删除旧文件并不像运行find那么简单。 -mtime +30-删除,因为通常你没有shell访问你的FTP空间。一切都必须通过FTP完成。

Here来了一个简单的perl脚本来完成这个技巧。它需要Net::FTP模块。

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()); } 
    } 
} 
相关问题