rm -rf在java运行时不适用于家庭代字号

时间:2014-11-11 07:12:04

标签: java rm

这是我删除文件夹的代码,下面的代码不会删除主文件夹下的Downloads目录。

import java.io.IOException;
public class tester1{   
        public static void main(String[] args) throws IOException {
        System.out.println("here going to delete stuff..!!");
        Runtime.getRuntime().exec("rm -rf ~/Downloads/2");
        //deleteFile();
        System.out.println("Deleted ..!!");     }    
}

但是,如果我给出完整的主路径,则可行:

   import java.io.IOException;
    public class tester1{   
            public static void main(String[] args) throws IOException {
            System.out.println("here going to delete stuff..!!");
            Runtime.getRuntime().exec("rm -rf /home/rah/Downloads/2");
            //deleteFile();
            System.out.println("Deleted ..!!");
        }
        }

有谁能告诉我我做错了什么。?

4 个答案:

答案 0 :(得分:7)

波形符号(~)由shell扩展。当您调用exec时,不会调用shell,而是立即调用rm二进制文件,因此不会扩展波形符。也不是通配符和环境变量。

有两种解决方案。要么自己替换代字号:

String path = "~/Downloads/2".replace("~", System.getProperty("user.home"))

或通过在命令行前面添加前缀来调用shell

Runtime.getRuntime().exec("sh -c rm -rf ~/Downloads/2");

答案 1 :(得分:3)

波浪线扩展由shell(例如bash)完成,但是,您直接运行rm,因此没有shell来解释~。我强烈建议不要依赖于调用shell来执行此类功能 - 它们容易出错,安全性能较差,并且限制了代码可以运行的操作系统。

但是,如果你真的决定使用这种特殊方法,你可以这样做:

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "rm -rf ~/Downloads/2" })

答案 2 :(得分:1)

您使用的是没有shell的shell语法。将命令更改为:

new String[]{"sh", "-c", "rm -rf ~/Downloads/2"}

答案 3 :(得分:0)

如果不需要使用代字号,则可以使用环境变量,例如$ HOME。

String homeDir = System.getenv("HOME"); Runtime.getRuntime().exec("rm -rf " + homeDir + "/Downloads/2");