1

ログディレクトリ内の古いログファイルを削除したい。6か月以上経過したログファイルを削除するために、次のようなスクリプトを作成しました。

/ dnbusr1 / ghmil / BDELogs / import -type f -mtime +120 -exec rm -f{}\;を検索します。

このスクリプトを使用することで古いファイルを削除できますが、Javaを使用してこのスクリプトを呼び出すにはどうすればよいですか?

4

5 に答える 5

3

java.lang.Runtime.exec()を使用します。

于 2009-01-23T04:21:20.870 に答える
3

移植性が問題で、Runtime.exec() を実行できない場合、File と FilenameFilter を使用して Java でこのコードを簡単に記述できます。

編集:ディレクトリツリーを削除するための静的メソッドは次のとおりです...フィルタリングロジックを簡単に追加できます:

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;
    }
于 2009-01-23T06:41:12.070 に答える
2

説明したコマンドのみを呼び出したい場合は、次のように呼び出します。

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();

複数のコマンドを呼び出したい場合は、Chris Jester-Young の回答を使用してください。exec メソッドは、使用したいファイルを定義することもできます。他の回答は、メソッドの説明にリンクしています。

于 2009-01-23T07:08:48.393 に答える
1

Javaでシステムコールを使用することは可能ですが、コードの移植性が失われるため、一般的にはお勧めできません。Antを調べて、このパージタスクのようなものを使用できます

于 2009-01-23T04:23:28.960 に答える
1

Crashworksの答えに加えて、次の引数を使用して呼び出しますcmdarray

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

が構文をfindサポートしている場合は、末尾のをに変更してください。コマンドの実行が速くなります(ファイルごとに1回ではなく、ファイルのバッチを一度に呼び出します)。-exec ... {} +";""+"rm

于 2009-01-23T04:32:14.967 に答える