Java и Unix - PullRequest
       260

Java и Unix

1 голос
/ 23 января 2009

Я хочу удалить старые файлы журналов в каталоге журналов. Чтобы удалить файлы журнала, которые более 6 месяцев, Я написал сценарий как

find / dnbusr1 / ghmil / BDELogs / import -type f -mtime +120 -exec rm -f {} \;

С помощью этого скрипта я могу удалить старые файлы. Но как вызвать этот скрипт с помощью Java? пожалуйста, помогите мне ...

Ответы [ 5 ]

3 голосов
/ 23 января 2009

Если переносимость является проблемой, препятствующей запуску с Runtime.exec (), этот код довольно просто написать на Java с помощью File и FilenameFilter.

Редактировать: Это статический метод удаления дерева каталогов ... вы можете легко добавить в логику фильтрации:

static public int deleteDirectory(File dir, boolean slf) {
    File[]                              dc;                                     // directory contents
    String                              dp;                                     // directory path
    int                                 oc=0;                                   // object count

    if(dir.exists()) {
        dir=dir.getAbsoluteFile();

        if(!dir.canWrite()) {
            throw new IoEscape(IoEscape.NOTAUT,"Not authorized to delete directory '"+dir+"'.");
            }

        dp=dir.getPath();
        if(dp.equals("/") || dp.equals("\\") || (dp.length()==3 && dp.charAt(1)==':' && (dp.charAt(2)=='/' || dp.charAt(2)=='\\'))) {
            // Prevent deletion of the root directory just as a basic restriction
            throw new IoEscape(IoEscape.GENERAL,"Cannot delete root directory '"+dp+"' using IoUtil.deleteDirectory().");
            }

        if((dc=dir.listFiles())!=null) {
            for(int xa=0; xa<dc.length; xa++) {
                if(dc[xa].isDirectory()) {
                    oc+=deleteDirectory(dc[xa]);
                    if(!dc[xa].delete()) { throw new IoEscape(IoEscape.GENERAL,"Unable to delete directory '"+dc[xa]+"' - it may not be empty, may be in use as a current directory, or may have restricted access."); }
                    }
                else {
                    if(!dc[xa].delete()) { throw new IoEscape(IoEscape.GENERAL,"Unable to delete file '"+dc[xa]+"' - it may be currently in use by a program, or have restricted access."); }
                    }
                oc++;
                }
            }

        if(slf) {
            if(!dir.delete()) { throw new IoEscape(IoEscape.GENERAL,"Unable to delete directory '"+dir+"' - it may not be empty, may be in use as a current directory, or may have restricted access."); }
            oc++;
            }
        }
    return oc;
    }
2 голосов
/ 23 января 2009

Если вы хотите вызвать только команду, которую вы описали, вызовите:

Runtime r = Runtime.getRuntime();
Process process = r.exec("find /dnbusr1/ghmil/BDELogs/import -type f -mtime +120 -exec rm -f {} \\;"); //$NON-NLS-1$
process.waitFor();

Если вы хотите вызвать более одной команды, используйте ответ Криса Джестера-Янга. Метод exec также может определять файлы, которые вы хотите использовать. Другие ответы связывают описание метода.

2 голосов
/ 23 января 2009

Использовать java.lang.Runtime.exec () .

1 голос
/ 23 января 2009

Добавляя к ответу Crashworks, вы вызываете эти аргументы в cmdarray:

new String[] {"find", "/dnbusr1/ghmil/BDELogs/import", "-type", "f",
    "-mtime", "+120", "-exec", "rm", "-f", "{}", ";"}

Если ваш find поддерживает синтаксис -exec ... {} +, измените ";" в конце на "+". Это заставит вашу команду работать быстрее (она вызовет rm для пакета файлов сразу, а не один раз для каждого файла).

1 голос
/ 23 января 2009

Использование системных вызовов в Java возможно, но обычно это плохая идея, потому что вы потеряете переносимость кода. Вы можете посмотреть в Ant и использовать что-то вроде задача очистки .

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