Java Runtime.getRunTime().exec和通配符?

14

我正在尝试使用以下方法清除垃圾文件:

Process p = Runtime.getRuntime().exec();

只要不使用通配符就可以正常工作,例如:

Process p = Runtime.getRuntime().exec("/bin/rm -f specificJunkFile.java");

当执行以下代码时,会抛出"没有此文件或目录"的错误:

Process p = Runtime.getRuntime().exec("/bin/rm -f *.java");

我应该能够像这里所述的那样执行所有的漂亮操作,对吗?

5个回答

15

这假设你正在运行一个可用命令解释器 sh 的系统上。这使得它有些不可移植。 - thoni56

9
这些是Bash通配符,它们在Bash shell中解释。您正在直接运行rm命令,因此没有shell将*解释为“所有文件”。
您可以使用bash作为命令。例如: Runtime.getRuntime().exec("/path-to/bash -c \"rm *.foo\"")

2
好的,我正在执行以下操作: Runtime.getRuntime().exec("/bin/bash -c "rm .foo""); 但是我遇到了以下错误: ERROR>.foo": -c: line 0: unexpected EOF while looking for matching `"' 我不理解这个错误... 转义符是正确的,不是吗? - Jakob

8

我建议您让Java来完成这个任务。

  • 使用file.listFiles()获取文件列表
  • 如果需要,使用file.getName().contains(string)来过滤它们
  • 遍历数组执行file.delete()

优点:提高了可移植性,节省了exec()的成本。


2
你如何通常使用通配符?不要删除等。假设我有自己的二进制文件,并且必须从Java代码中启动它。你会怎么做? - harithski
1
前两个项目是处理 *,第三个对应于 rm。因此,您需要知道字符串的哪个部分是文件名模式,但除此之外,您可以使用从 listFiles() 获取的文件列表拼接任何命令行(前提是您的外部命令接受多个文件名)。 - thoni56

2

Runtime.getRuntime().exec(new String[] { "sh", "-c", "gunzip *.gz" });

的意思是执行一个shell命令,解压当前目录下所有的.gz文件。


0
  1. 使用 exec(String[] {cmd, arg1, arg2...})

  2. 以下是一个完整的示例,以字符串形式获取结果:Link


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