如何转义java特殊字符并运行Linux命令

时间:2016-10-15 13:24:54

标签: java linux escaping

我正在编写一个java程序来查找目录中的特定文件(具有特殊权限和文件类型的文件)。以下命令正确执行,因为没有任何特殊字符。

find /home/Cnf271/Desktop/ -perm -4000 ;

现在,如果我尝试使用我的java程序执行以下命令,终端不会给出正确的结果。

find /home/Cnf271/Desktop/ -name "*.txt" -perm -4000 -exec ls -ldb {} \;

Java程序,

//
        ..
        System.out.print("Please enter directory path: ");
        fileDirectory = scan.next();

        System.out.print("Please enter file type (txt/pdf): ");
        fileType = scan.next();
        filetypecmd = " \"*." +fileType+ "\" ";

        System.out.println(filetypecmd);
        String cmd = "find "+fileDirectory+ " -name "+filetypecmd+" -perm -4000" ;

        Runtime run = Runtime.getRuntime();

        Process process = run.exec(cmd);

        BufferedReader buffer = new BufferedReader(new InputStreamReader(process.getInputStream()));

        String space = "";

        while ((space=buffer.readLine())!=null) {

        System.out.println(space);
        ..
        //

程序工作正常。但是,String cmd命令没有给我一个正确的结果,因为linux命令包含了特殊字符。如何在我的java程序中执行以下命令。

find /home/Cnf271/Desktop/ -name "*.txt" -perm -4000 -exec ls -ldb {} \;

感谢。

1 个答案:

答案 0 :(得分:2)

Linux命令shell需要引用(或转义特殊字符)的元素在Runtime.exec()执行时需要引用(它们不需要< em>受shell保护)。

在您的代码中,删除通配符搜索参数上的额外引号:

String filetypecmd = " *." + fileType + " ";

我对此进行了测试,并且能够在Linux上正确运行您的代码,但我必须删除您的-perm -4000参数才能获得结果。我收到了{strong>没有结果,"*.txt"附近有额外的引号,但没有它们一切都很好。

顺便说一句,您还可以使用Scanner来收集结果:

Scanner results = new Scanner(process.getInputStream());
while (results.hasNextLine())
{
    System.out.println(results.nextLine());
}