Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何转义java特殊字符并运行Linux命令_Java_Linux_Escaping - Fatal编程技术网

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

如何转义java特殊字符并运行Linux命令,java,linux,escaping,Java,Linux,Escaping,我正在编写一个java程序来查找目录中的特定文件(具有特殊权限的文件和按文件类型)。由于没有任何特殊字符,以下命令将正确执行 find /home/Cnf271/Desktop/ -perm -4000 ; 现在,如果我尝试使用java程序执行以下命令,终端不会给出正确的结果 find /home/Cnf271/Desktop/ -name "*.txt" -perm -4000 -exec ls -ldb {} \; Java程序 // .. System.

我正在编写一个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 {} \;

谢谢。

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

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

String filetypecmd = " *." + fileType + " ";
我对此进行了测试,并且能够在Linux上正确运行您的代码,但是我必须删除您的
-perm-4000
参数才能在我的例子中获得结果。我收到了没有的结果,在
“*.txt”
周围加了额外的引号,但没有它们,一切都很好

顺便说一句,您还可以使用
扫描仪
收集结果:

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

您是否在
之前尝试过双反斜杠
\\
字符?我没有看到您添加
字符。Java也使用反斜杠来转义,所以您可能必须在字符串中“双转义”字符…@MaartenBodewes是的,我尝试了反斜杠。filetypecmd=“\”*。“+fileType+”\”;我的java程序中没有语法错误。我认为linux不会执行该命令,因为它包含反斜杠等其他字符。现在,如果我使用转义字符来隐藏java语法错误,java程序可以正常工作。但是当命令在linux环境中运行时,它不会给出正确的结果。感谢:由于Java7,您还可以读取文件权限。搜索文件会很容易,避开了这个问题(XY问题)。@MaartenBodewes谢谢。但我正在尝试使用linux find命令执行该命令。非常感谢!另外,我在字符串cmd中添加了双引号以获得结果。String cmd=“find”+fileDirectory+“-name”+filetypecmd+“+”-perm-4000”;