rm -rf не работает с домашней тильдой во время выполнения Java
Это мой код для удаления папки, этот код ниже не удаляет каталог загрузок в домашней папке.
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 ответа
Тильда (~
) расширяется оболочкой. Когда вы звоните exec
оболочка не вызывается, а rm
Двоичный файл вызывается немедленно, поэтому тильды не раскрываются. Также не подстановочные знаки и переменные среды.
Есть два решения. Либо замените тильду на себя так:
String path = "~/Downloads/2".replace("~", System.getProperty("user.home"))
или вызвать оболочку, добавив префикс вашей командной строки следующим образом
Runtime.getRuntime().exec("sh -c rm -rf ~/Downloads/2");
Расширение тильды выполняется оболочкой (например, bash), однако вы работаете rm
непосредственно, так что нет оболочки для интерпретации ~
, Я настоятельно рекомендую не полагаться на вызов оболочки для таких функций - они подвержены ошибкам, имеют плохие свойства безопасности и ограничивают операционные системы, в которых может выполняться ваш код.
Однако, если вы действительно решили использовать этот конкретный метод, вы можете сделать:
Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "rm -rf ~/Downloads/2" })
Вы используете синтаксис оболочки без оболочки. Измените команду на эту:
new String[]{"sh", "-c", "rm -rf ~/Downloads/2"}
Вы можете использовать переменную окружения, такую как $HOME, если использовать тильду не нужно.String homeDir = System.getenv("HOME");
Runtime.getRuntime().exec("rm -rf " + homeDir + "/Downloads/2");