如何在java中使用“ls * .c”命令?

时间:2013-03-24 12:50:04

标签: java linux command-line ls

我正在尝试在java中打印“* .C”文件

我使用以下代码

public static void getFileList(){
    try
    {
        String lscmd = "ls *.c";
        Process p=Runtime.getRuntime().exec(lscmd);
        p.waitFor();
        BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line=reader.readLine();
        while(line!=null)
        {
            System.out.println(line);
            line=reader.readLine();
        }
    }
    catch(IOException e1) {
        System.out.println("Pblm found1.");
    }
    catch(InterruptedException e2) {
        System.out.println("Pblm found2.");
    }

    System.out.println("finished.");
}

P.S: - 它对“ls”命令工作正常。当我在任何命令中使用“*”时,一切都不起作用。需要在java中的命令中替换“*”。

更新

感谢您的帮助。

现在我需要在java中注释“ls -d1 $ PWD / **”的相同结果。它将列出具有完整路径的所有目录名称。

感谢您的时间。

6 个答案:

答案 0 :(得分:12)

您可能会发现这更可靠:

Path dir = Paths.get("/path/to/directory");

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.c")) {
    for (Path file : stream) {
        // Do stuff with file
    }
}

答案 1 :(得分:2)

或者,您可以使用public File[] File.listFiles(FilenameFilter filter)

File[] files = dir.listFiles(new FilemaneFilter() {
  public boolean accept(File dir, String name) {
    return name.endsWith(".c");
  }
}

答案 2 :(得分:2)

您需要执行“bash -c'ls * .c'”形式的命令...因为java exec方法不理解'*'扩展(globbing)。 (“bash -c”形式确保使用shell来处理命令行。)

但是,您不能简单地将上述命令作为单个String提供给Runtime.exec(...),因为exec也无法理解拆分在其中引用的acommand字符串的正确方法。 / p>

因此,要让exec做正确的事,你需要做这样的事情:

  String lscmd = "ls *.c";
  Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});

换句话说,你需要手工分裂参数......


应该注意的是,这个例子也可以通过使用FileMatcher来执行“globbing”并从结果中组装参数列表来实现。但是如果你要运行ls以外的其他东西,那就太复杂了...而IMO的复杂性是不合理的。

答案 3 :(得分:1)

*由shell扩展。因此,要使用它将文件名扩展为glob,您必须通过shell调用ls命令,例如像这样:

String lscmd = " bash -c 'ls *.c' ";

修改

来自@Stephen的好点,关于exec未能拆分命令。要执行ls -d1 $PWD/*,您可以这样做:

String lscmd = "ls -d1 $PWD/*";
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});

答案 4 :(得分:1)

Java方法是使用FilenameFilter。我改编了here的代码示例:

import java.io.File;
import java.io.FilenameFilter;
public class Filter implements FilenameFilter {

  protected String pattern;

  public Filter (String str) {
    pattern = str;
  }

  public boolean accept (File dir, String name) {
    return name.toLowerCase().endsWith(pattern.toLowerCase());
  }

  public static void main (String args[]) {

    Filter nf = new Filter (".c");

    // current directory
    File dir = new File (".");
    String[] strs = dir.list(nf);

    for (int i = 0; i < strs.length; i++) {
      System.out.println (strs[i]);
    }
  }
}

<强>更新

对于您的更新,您可以迭代new File (".").listFiles();并在每个文件上发出file.getAbsolutePath()

答案 5 :(得分:1)

自Java 7以来列出文件的一个示例。

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
    public static void main(String[] args) {
        Path dir = Paths.get("/your/path/");
        try {
            DirectoryStream<Path> ds = Files.newDirectoryStream(dir, "*.{c}");
            for (Path entry: ds) {
                System.out.println(entry);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}