2012-05-22 29 views
5

Các công trình sau đây từ các thiết bị đầu cuối không có vấn đềJava thực hiện chương trình dòng lệnh 'find' trả về lỗi

find testDir -type f -exec md5sum {} \; 

đâu testDir là một thư mục có chứa một số tập tin (ví dụ file1, file2 và file3).

Tuy nhiên, tôi nhận được một lỗi bằng cách sử dụng sau trong Java

Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec("find testDir -type f -exec md5sum {} \\;"); 

Lỗi này là

find: missing argument to `-exec' 

Tôi tin rằng tôi đang thoát các nhân vật một cách chính xác. Tôi đã thử nhiều định dạng khác nhau và tôi không thể làm việc này.

CẬP NHẬT @jtahlborn trả lời câu hỏi một cách hoàn hảo. Nhưng lệnh bây giờ đã thay đổi một chút để sắp xếp từng tệp trong thư mục trước khi tính toán md5sum và như sau (Tôi đã chấp nhận câu trả lời tuyệt vời cho câu hỏi ban đầu vì vậy tôi sẽ mua cho ai đó một bia nếu họ có thể tìm ra định dạng đó . cho điều này tôi đã cố gắng mọi sự kết hợp tôi có thể nghĩ sau câu trả lời dưới đây không thành công)

"tìm testDir -type f -exec md5sum {} + |. awk {print $ 1} | loại | md5sum ; "

MỚI CẬP NHẬT

Đối với đường ống, bạn cần có một vỏ vì vậy tôi đã kết thúc với điều này, mà làm việc tuyệt vời và bạn vẫn có thể nhận được đầu ra.

Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec(new String[] 
{ 
    "sh", "-l", "-c", "find " + directory.getPath() + " -type f -exec md5sum {} + | awk '{print $1}' | sort | md5sum" 
}); 
+0

Làm thế nào để bạn nhận được phản hồi? [SSCCE] (http://SSCCE.org) sẽ ổn. –

Trả lời

5

sử dụng lệnh đa đối số để thực hiện (nếu không bạn có thể bị các quy tắc thoát) cắn. cũng có, vì bạn không gọi từ một kịch bản shell, bạn không cần phải thoát khỏi dấu chấm phẩy:

Process pr = rt.exec(new String[]{"find", "testDir", "-type", "f", "-exec", "md5sum", "{}", ";"}); 
+0

Rực rỡ. Tôi đã thử điều này trước đó nhưng có toàn bộ tham số exec là một chuỗi - "-exec", "md5sum {};" –

+1

hoặc Runtime.getRuntime(). Exec ("tìm testDir-type f -exec md5sum {} \\;". Split ("")); – ianpojman

+0

Được rồi, tôi sẽ mua cho bạn một ly bia nếu bạn có thể định dạng này "find testDir-type f -exec md5sum {} + | awk {print $ 1} | sort | md5sum;" –

0

Đối với những thứ như đường ống, bạn cần một lớp vỏ mà bạn không nhận được với Runtime.exec.

Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec(new String[] 
{ 
    "sh", "-l", "-c", "find " + directory.getPath() + " -type f -exec md5sum {} + | awk '{print $1}' | sort | md5sum" 
}); 
Các vấn đề liên quan