2014-11-11 2 views
3

Это мой код для удаления папки, этот ниже код не удаляет каталог «Загрузки» под домашней папкой.rm -rf не работает с домашней тильдой в java runtime

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 ..!!"); 
     } 
     } 

Может кто-нибудь сказать мне, что я делаю неправильно.?

+0

вы можете добавить сообщение об ошибке на него? – ssj

+2

Вероятно, '' 'не распространяется на пользовательский дом. Вместо этого попробуйте использовать 'System.getProperty (« user.home »)'. – Paolo

ответ

1

Вы используете синтаксис оболочки без оболочки. Измените команду к следующему:

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

Это тоже не сработает, так как значение -c должно быть «одной строкой», java увидит это как «sh» «-c» «rm» «-rf» «~/Downloads/2» вместо «sh» «-c» «rm -rf ~/Downloads/2», чтобы исправить это, OP должен использовать 'exec (new String [] {" sh "," -c "," rm -rf ~/Downloads/2 "}); вместо этого. Просто исправьте свой ответ – morgano

+0

@morgano Я сделал предложенное изменение, так как это улучшение в направлении более конкретного, но я не согласен с утверждением, что «это тоже не сработает». Я только заявил, какая команда должна быть, и я сделал это правильно. Я ничего не говорил о том, как разделить команду. – EJP

7

тильды (~) расширяется за счет оболочки. Когда вы вызываете exec, никакая оболочка не вызывается, а двоичный код rm вызывается сразу и, следовательно, тильды не расширяются. Не являются подстановочными знаками и переменными среды.

Существует два решения. Либо заменить тильды себя так:

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

или вызвать оболочку, предваряя командную строку, как так

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

Недостаточно префиксации, поскольку 'Runtime.exec (String)' окончательно сломан и никогда не должен использоваться. Путем выполнения с оболочкой будет 'Runtime.getRuntime(). Exec (new String [] {" sh "," -c "," rm -rf ~/Downloads/2 "});' –

+0

да, thats гораздо лучше избегать цитирования проблем, а что нет. Вы думаете о какой-то другой проблеме, о которой я не знаю? – vidstige

+0

Требуется, чтобы команда работала вообще. Без версии массива команда эквивалентна 'sh -c rm'. –

3

Тильда расширение делается оболочкой (например, Баш.), Однако, вы работает rm напрямую, поэтому нет оболочки для интерпретации ~. Я настоятельно рекомендую не полагаться на вызов в оболочку для таких функций - они подвержены ошибкам, имеют плохие свойства безопасности и ограничивают операционные системы, на которых может работать ваш код.

Однако, если вы действительно решили использовать данный метод, вы можете сделать:

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

0

Вы можете использовать переменную окружения, такие как $ HOME, если используется тильду не является необходимым.

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

Смежные вопросы