Как удалить файлы старше N недель с FTP-сервера Microsoft - PullRequest
1 голос
/ 21 ноября 2008

Я запускаю сервер OpenSuse, который каждую ночь загружает архивные копии исходного кода на FTP-сервер Microsoft. Я написал сценарий Bash, который делает это с помощью задания cron.

Я хочу удалить файлы резервных копий, которые старше определенной даты. Как я мог это сделать?

Ответы [ 4 ]

1 голос
/ 03 июня 2011
/*******************************************************************************************
* 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()); }
    }
}
1 голос
/ 21 ноября 2008

Вы можете удалить файлы на FTP-сервере, используя команды FTP delete или mdelete. Я не знаю, как выбрать старые файлы в качестве серверной операции, поэтому одним из вариантов было бы сделать FTP ls, чтобы получить список файлов на сервере, а затем проанализировать вывод, чтобы подобрать те файлы, которые старше указанной вами даты. Затем удалите каждый из них с помощью команды FTP.

Если у вас есть локальная копия всех файлов, то, вероятно, проще создать список файлов локально, используя find, а затем удалять их по одному с сервера.

Если у вас есть некоторый контроль над FTP-сервером, то использование rysnc вместо FTP, вероятно, будет проще.

1 голос
/ 09 октября 2009

К сожалению, удалить старые файлы с FTP-сервера не так просто, как запустить find. -mtime +30 -delete, потому что обычно вы не получаете доступ оболочки к вашему пространству FTP. Все должно быть сделано через FTP.

Здесь поставляется простой Perl-скрипт, который добивается цели. Требуется модуль Net::FTP.

1 голос
/ 21 ноября 2008

Следующее удаляет все файлы в дереве каталогов с корнем в dir , время последнего изменения которого было до 1 ноября:

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

Формат даты / времени должен быть ISO 8601; Я не знаю, принимаются ли другие форматы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...