如何使用;ls*.c";java中的命令?

如何使用;ls*.c";java中的命令?,java,linux,command-line,ls,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 InputStreamRea

我正在尝试用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.");
}
注意:-对于“ls”命令来说,它工作得很好。当我在任何命令中使用“*”时,所有命令都不工作。需要在java中替换命令中的“*”

更新

谢谢你们的帮助

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


谢谢您的时间。

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

编辑

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

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

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

导入java.io.File;
导入java.io.FilenameFilter;
公共类筛选器实现FilenameFilter{
保护字符串模式;
公共筛选器(字符串str){
模式=str;
}
公共布尔接受(文件目录,字符串名称){
返回name.toLowerCase().endsWith(pattern.toLowerCase());
}
公共静态void main(字符串参数[]){
过滤器nf=新过滤器(“.c”);
//当前目录
文件目录=新文件(“.”);
字符串[]strs=dir.list(nf);
对于(int i=0;i
更新:


对于更新,您可以迭代一个
新文件(“.”.listFiles()并在每个文件上发出
file.getAbsolutePath()

您可能会发现这更可靠:

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

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.c")) {
    for (Path file : stream) {
        // Do stuff with file
    }
}
Path dir=Path.get(“/Path/to/directory”);
try(DirectoryStream=Files.newDirectoryStream(dir,“*.c”)){
用于(路径文件:流){
//处理文件
}
}

或者,您可以使用


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

但是,您不能简单地将上面的命令作为单个字符串提供给
Runtime.exec(…)
,因为
exec
也不了解拆分包含引号的命令字符串的正确方法

因此,要让
exec
做正确的事情,您需要执行以下操作:

String lscmd = "ls -d1 $PWD/*";
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});
  String lscmd = "ls *.c";
  Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd});
换句话说,你需要手工进行参数拆分



应该注意的是,这个示例也可以通过使用
FileMatcher
执行“全局绑定”并根据结果组装参数列表来实现。但是,如果您要运行的不是
ls
,那么这会很复杂。。。在我看来,这种复杂性是不合理的。

一个例子列出了自Java7以来的文件

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();
        }
    }
}
import java.io.IOException;
导入java.nio.file.DirectoryStream;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
公共班机{
公共静态void main(字符串[]args){
Path dir=Path.get(“/your/Path/”);
试一试{
DirectoryStream ds=Files.newDirectoryStream(dir,*.{c});
用于(路径条目:ds){
系统输出打印项次(输入);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}

使用
ls
命令执行此操作有什么具体原因吗?是的。。。我需要打印带有完整路径的文件/目录名。所以我尝试了这个例子。@Querier Re:您的更新:不要这样做;不要在你的问题上移动门柱。如果你原来的问题得到了回答,接受这个答案,并尝试使用你所掌握的信息来解决你修改过的问题。在编写整个程序时,不要拖拽回答问题的人。如果您再次陷入困境,请打开一个新问题,询问您已经走了多远。此外,在JavaSE7中,您似乎有一个API可用于全局文件路径:。Globbing就是在shell中扩展路径模式(
*
等)。
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();
        }
    }
}