我正在编写一个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 {} \;
感谢。
答案 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());
}