开发者

How to run the Linux "cd" command from Java?

开发者 https://www.devze.com 2023-04-12 13:43 出处:网络
I want to write a Java program to delete ~12 directories or files which are under my home directory. I am able to do this by using

I want to write a Java program to delete ~12 directories or files which are under my home directory. I am able to do this by using

Process proc = Runtime.getRuntime().exec("rm -rf *path*") 

But I have to run this command 12 times or I can keep it in loop. What I really want is to have a file in my home directory that contains the names of all the directories and files to delete in it. My Java program should go to the home directory, read the file, and delete all the specified files.

I am stuck at the very first step – I am not able to cd to the home directory. Please let me know how can I achieve this.


Thanks for all of your replies.

But, here I don't really want to use the Java util classes rather I want to learn a way using which I can run Linux commands in my Java class. Being a deployment Intern, I have to reset the environment every time before deploying a new environment for the customer. For this, I repeatedly use some basic Linux commands. I can write a shell script to do this but for this time, I want to write a Java class in which I can put all these Linux commands and run from one class.

The commands which I use are:

  1. kill all java processes which are started by the admin ONLY – for this I need to use multiple Linux commands with “pipe”
  2. Remove all 12-directories/files from home directory
  3. stop some services (like siebel, etc.) – for this I need to go开发者_如何学编程 under the particular directories and run ./shutdown.sh or ./stop_ns, etc.
  4. run some database scripts – to reset the database schemas
  5. again start the services – same as step 2 except this time I need to run ./start_ns, etc.

I really appreciate if you can let me know a. How can I navigate into a directory using Java code b. How can I run multiple Linux commands using pipe using Java code


Why do you need to "go" to the home directory? Just read the file wherever you are:

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

It's very rarely a good idea to require that a process changes working directory just to do the right thing.


You dont need to change directory. You can just read file using absolute path using FileReader(String fileName).


For deleting entire directories, try Apache Commons IO's class FileUtils:

FileUtils.deleteDirectory(new File(System.getProperty("user.home")));

Or use cleanDirectory to delete everything in home but not home itself:

FileUtils.cleanDirectory(new File(System.getProperty("user.home")));

If you want to delete specific files only (e.g. those matching a name pattern), list the files first, then delete them:

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();
 }


"cd" is a shell internal command, not a executable program.

Even you can change dir in java program by whatever means like JNA, when it exit, the current dir in shell is not changed, because the java program runs in another process than the shell.

But we still can do something about it.

eg. I want to make a new shell command called xcd, it popup a GUI shows a list let you select directories existed in bash history, and change current dir to it for you.

  1. in ~/.bashrc add a line:
xcd(){
  XCDRES=`xcd.sh`
  if [ "$XCDRES" ]; then
    cd "$XCDRES"
  fi
}

2.xcd.sh is

#!/bin/bash
java -cp $PATH1/xcd.jar neoe.xcd.Main

and add xcd.sh to PATH

  1. the java program is
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. use xcd in shell.


You can't really do that. Java programs don't really allow you to change the "current working directory" as most people understand it (not without using native code, anyway). The normal Java approach is to open a File instance on the directory you want to manipulate, and then use operations on that instance to manipulate the files/directories in question.

For details on how to delete directories programatically in Java, see: Delete directories recursively in Java

0

精彩评论

暂无评论...
验证码 换一张
取 消