我想写一个Java程序来删除我家目录下的~12个目录或文件。我可以使用
来做到这一点Process proc = Runtime.getRuntime().exec("rm -rf *path*")
但我必须运行此命令12次,否则我可以将其保持循环状态。我真正想要的是在我的主目录中有一个文件,其中包含要删除的所有目录和文件的名称。我的Java程序应该转到主目录,读取文件,并删除所有指定的文件。
我陷入了第一步 - 我无法cd到主目录。请让我知道如何实现这一目标。
感谢您的所有回复。
但是,我真的不想使用Java util类,而是想学习一种在Java类中运行Linux命令的方法。作为部署实习生,我必须在每次为客户部署新环境之前重置环境。为此,我反复使用一些基本的Linux命令。我可以写一个shell脚本来做这个,但是这次,我想编写一个Java类,我可以把所有这些Linux命令放在一个类中运行。
我使用的命令是:
如果你能让我知道,我真的很感激 一个。如何使用Java代码导航到目录 湾如何使用Java代码
使用管道运行多个Linux命令答案 0 :(得分:4)
为什么你需要“去”主目录?只要你在任何地方阅读文件:
String homeDirectory = System.getProperty("user.home");
File file = new File(homeDirectory, "filenames.txt"); // Or whatever
// Now load the file using "file" in the constructor call to FileInputStream etc
要求流程更改工作目录只是为了做正确的事情,这是一个好主意。
答案 1 :(得分:1)
您无需更改目录。您可以使用FileReader(String fileName)使用绝对路径读取文件。
答案 2 :(得分:1)
要删除整个目录,请尝试Apache Commons IO的类FileUtils
:
FileUtils.deleteDirectory(new File(System.getProperty("user.home")));
或者使用cleanDirectory
删除家中的所有内容,但不能删除本身:
FileUtils.cleanDirectory(new File(System.getProperty("user.home")));
如果您只想删除特定文件(例如与名称模式匹配的文件),请先列出文件,然后删除它们:
File startDir = new File(System.getProperty("user.home"));
//this should return the leaf files first, then the inner nodes of the directory tree
Collection<File> files = FileUtils.listFiles(startDir , someFileFiler, someDirFilter);
for(File f : files) {
f.delete();
}
答案 3 :(得分:1)
“ cd” 是shell内部命令,不是可执行程序。
即使您可以通过JNA之类的方法在java程序中更改dir,退出时,shell中的当前目录也不会更改,因为java程序在shell之外的其他进程中运行。
但是我们仍然可以做一些事情。
例如我要创建一个名为xcd
的新Shell命令,它会弹出一个GUI,显示一个列表,您可以通过该列表选择bash历史记录中存在的目录,并为您更改当前目录。
~/.bashrc
中添加一行:xcd(){
XCDRES=`xcd.sh`
if [ "$XCDRES" ]; then
cd "$XCDRES"
fi
}
2。xcd.sh
是
#!/bin/bash
java -cp $PATH1/xcd.jar neoe.xcd.Main
并将xcd.sh
添加到PATH
package neoe.xcd;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
public class Main {
public static String getUserHomeDir() {
return System.getProperty("user.home");
}
public static void main(String[] args) throws Exception {
new Main().run();
}
public static String readString(InputStream ins, String enc) throws IOException {
if (enc == null)
enc = "UTF-8";
BufferedReader in = new BufferedReader(new InputStreamReader(ins, enc));
char[] buf = new char[1000];
int len;
StringBuffer sb = new StringBuffer();
while ((len = in.read(buf)) > 0) {
sb.append(buf, 0, len);
}
in.close();
return sb.toString();
}
private String[] selection = new String[1];
private void run() throws Exception {
File hisfile = new File(getUserHomeDir(), ".bash_history");
if (!hisfile.exists()) {
System.err.println(".bash_history not exists, quit");
return;
}
String[] ss = readString(new FileInputStream(hisfile), null).split("\n");
List<String> res = new ArrayList<String>();
Set uniq = new HashSet();
for (String s : ss) {
s = s.trim();
if (!s.startsWith("cd /")) {
continue;
}
s = s.substring(3);
File f = new File(s);
if (f.isDirectory()) {
s = f.getAbsolutePath();
if (uniq.contains(s)) {
continue;
}
uniq.add(s);
res.add(s);
}
}
if (res.isEmpty()) {
System.err.println("no cd entry, quit");
return;
}
Collections.sort(res);
String cd1 = selectFromList(res);
if (cd1 == null) {
System.err.println("not selected, quit");
return;
}
doCd(cd1);
}
private void doCd(String cd1) throws Exception {
System.out.println(cd1);
}
private String selectFromList(List<String> res) {
final JList list = new JList(res.toArray());
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final JDialog frame = wrapFrame(new JScrollPane(list), "select dir to cd");
list.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() > 1) {
String s = (String) list.getSelectedValue();
selection[0] = s;
frame.dispose();
}
}
});
list.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int kc = e.getKeyCode();
if (kc == KeyEvent.VK_ESCAPE) {
frame.dispose();
} else if (kc == KeyEvent.VK_ENTER) {
String s = (String) list.getSelectedValue();
selection[0] = s;
frame.dispose();
}
}
});
frame.setVisible(true);
frame.requestFocus();
return selection[0];
}
private JDialog wrapFrame(JComponent comp, String title) {
JDialog frame = new JDialog();
frame.setTitle("select dir to cd");
frame.setModal(true);
frame.add(comp);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(400, 600);
frame.setLocationRelativeTo(null);
return frame;
}
}
xcd
。答案 4 :(得分:0)
你真的不能这样做。 Java程序实际上并不允许您更改“当前工作目录”,因为大多数人都理解它(不管是否使用本机代码)。普通的Java方法是在要操作的目录上打开File实例,然后使用该实例上的操作来操作有问题的文件/目录。
有关如何在Java中以编程方式删除目录的详细信息,请参阅:Delete directories recursively in Java