rm-rf不能在java运行时使用home tilde
这是我删除文件夹的代码,下面的代码不会删除主文件夹下的下载目录rm-rf不能在java运行时使用home tilde,java,rm,Java,Rm,这是我删除文件夹的代码,下面的代码不会删除主文件夹下的下载目录 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("
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 ..!!");
}
}
有人能告诉我我做错了什么吗?您使用的是没有shell的shell语法。将命令更改为:
new String[]{"sh", "-c", "rm -rf ~/Downloads/2"}
波浪线(~
)由shell展开。调用exec
时,不会调用shell,而是立即调用rm
二进制文件,因此不会展开tilde。通配符和环境变量也不是
有两种解决办法。或者像这样更换瓷砖:
String path = "~/Downloads/2".replace("~", System.getProperty("user.home"))
或者通过在命令行前面加前缀来调用shell,如下所示
Runtime.getRuntime().exec("sh -c rm -rf ~/Downloads/2");
tilde扩展由shell(例如bash)完成,但是,您直接运行的是
rm
,因此没有shell来解释~
。我强烈建议不要依赖于调用shell来实现这些函数——它们容易出错,安全性差,并且限制了代码可以运行的操作系统
但是,如果您确实决定使用此特定方法,您可以:
Runtime.getRuntime().exec(新字符串[]{/bin/bash“,“-c”,“rm-rf~/Downloads/2”})
如果不需要使用tilde,可以使用环境变量,例如$HOME。
String homeDir=System.getenv(“HOME”);
Runtime.getRuntime().exec(“rm-rf”+homeDir+“/Downloads/2”)代码>您可以将错误消息添加到其中吗?可能~
未扩展到用户主页。尝试改用System.getProperty(“user.home”)
。这也不起作用,因为-c的值必须是“一个字符串”,java会将其视为“sh”“-c”“rm”“-rf”“~/Downloads/2”而不是“sh”“-c”“rm-rf~/Downloads/2”,要修复它,OP必须使用exec(新字符串[]{“sh”“,“-c”,“rm-rf~/Downloads/2”)代码>取而代之。把你的头发修好answer@morgano我已经做出了建议的改变,因为这是在更具体的方向上的改进,但我不接受“这也行不通”的说法。我只说了命令应该是什么,我说得对。我没有说任何关于如何分割命令的内容。前缀是不够的,因为Runtime.exec(String)
已被终止,不应使用。使用shell执行的方式是Runtime.getRuntime().exec(新字符串[]{“sh”、“-c”、“rm-rf~/Downloads/2”})代码>是的,避免引用问题和其他问题要好得多。你是在想我不知道的其他事情吗?这是命令运行所必需的。如果没有阵列版本,该命令相当于sh-crm
。