如何从Java运行Linux“cd”命令?

时间:2011-10-10 16:30:04

标签: java

我想写一个Java程序来删除我家目录下的~12个目录或文件。我可以使用

来做到这一点
Process proc = Runtime.getRuntime().exec("rm -rf *path*") 

但我必须运行此命令12次,否则我可以将其保持循环状态。我真正想要的是在我的主目录中有一个文件,其中包含要删除的所有目录和文件的名称。我的Java程序应该转到主目录,读取文件,并删除所有指定的文件。

我陷入了第一步 - 我无法cd到主目录。请让我知道如何实现这一目标。


感谢您的所有回复。

但是,我真的不想使用Java util类,而是想学习一种在Java类中运行Linux命令的方法。作为部署实习生,我必须在每次为客户部署新环境之前重置环境。为此,我反复使用一些基本的Linux命令。我可以写一个shell脚本来做这个,但是这次,我想编写一个Java类,我可以把所有这些Linux命令放在一个类中运行。

我使用的命令是:

  1. 杀死所有由管理员启动的java进程 - 为此我需要使用多个Linux命令“pipe”
  2. 从主目录中删除所有12个目录/文件
  3. 停止一些服务(比如siebel等) - 为此,我需要在特定目录下运行./shutdown.sh或./stop_ns等。
  4. 运行一些数据库脚本 - 重置数据库模式
  5. 再次启动服务 - 与第2步相同,但这次我需要运行./start_ns等。
  6. 如果你能让我知道,我真的很感激 一个。如何使用Java代码导航到目录 湾如何使用Java代码

    使用管道运行多个Linux命令

5 个答案:

答案 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历史记录中存在的目录,并为您更改当前目录。

  1. ~/.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

  1. java程序是
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;
    }

}
  1. 在外壳中使用xcd

答案 4 :(得分:0)

你真的不能这样做。 Java程序实际上并不允许您更改“当前工作目录”,因为大多数人都理解它(不管是否使用本机代码)。普通的Java方法是在要操作的目录上打开File实例,然后使用该实例上的操作来操作有问题的文件/目录。

有关如何在Java中以编程方式删除目录的详细信息,请参阅:Delete directories recursively in Java