ProcessBuilder在文件存在时出现“文件未找到”异常

5

我正在开发一个应用程序,它将在Linux Web服务器上运行,用于删除特定目录中的日志文件,但是我一直收到FileNotFound异常。

以下是代码:

public static void deleteLOG() {
    try {
        ProcessBuilder probuilder = new ProcessBuilder("find /home/root/multicraft/servers/ -name '*.log' -delete");
        probuilder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

问题和异常处理

java.io.IOException: Cannot run program "find . -name '*CoreData*' -delete" (in directory "/home/root/multicraft/servers"): error=2, No such file or directory
        at java.lang.ProcessBuilder.start(Unknown Source)
        at com.mcprohosting.com.nodecleanup.Preprocess.deleteCoreData(Preprocess.java:23)
        at com.mcprohosting.com.nodecleanup.handlers.CleanupHandler.executeCleanup(CleanupHandler.java:36)
        at com.mcprohosting.com.main.NodeCleaner.init(NodeCleaner.java:29)
        at com.mcprohosting.com.main.NodeCleaner.main(NodeCleaner.java:25)
Caused by: java.io.IOException: error=2, No such file or directory
        at java.lang.UNIXProcess.forkAndExec(Native Method)
        at java.lang.UNIXProcess.<init>(Unknown Source)
        at java.lang.ProcessImpl.start(Unknown Source)
        ... 5 more

不过,命令 cd /home/root/multicraft/servers 可以完美地运行。

我还尝试了:

    ProcessBuilder probuilder = new ProcessBuilder("find . -name '*Backup*' -delete");
    probuilder.directory(new File("/home/root/multicraft/servers/"));
    probuilder.start();
2个回答

18
ProcessBuilder 构造函数接收多个字符串 - 可以作为 List<String> 或可变数量的参数,每个参数都是 String 类型: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html#ProcessBuilder(java.util.List) http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html#ProcessBuilder(java.lang.String...) 您遇到了困难,因为您将整个命令作为一个字符串传递,导致 JVM 寻找名为 "find /home/root/multicraft/servers/ -name '*.log' -delete" 的程序,而不是 find
您需要将长命令分成几部分,例如:
ProcessBuilder pb = new ProcessBuilder("find", ".", "-name", "'*CoreData*"...);

谢谢您的回答,没有出现更多错误,但是它并没有删除任何文件。为了获得更多信息,该命令通常需要几秒钟才能完成,但在执行这些行时没有暂停。供您参考,以下是更新后的代码行 - “find”,“/home/root/multicraft/servers/”,“-name”,“'* CoreData *'”,“-delete”。 - Matthew Salsamendi
你那里有名为 CoreData 的文件吗?我看到你从模式的开头和结尾删除了 * - Isaac

1
    try {
        ProcessBuilder probuilder = new ProcessBuilder("<Absolute Path To>/find /home/root/multicraft/servers/ -name '*.log' -delete");
        probuilder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }

"" 应该理想地是 /bin 或 /usr/bin。
ProcessBuilder probuilder = new ProcessBuilder("find /home/root/multicraft/servers/ -name '*Backup*' -delete");
probuilder.directory(new File("<Absolute Path To>"));
probuilder.start();

probuilder.directory 期望的是工作目录,其中包含find


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接