5

以下は端末からの動作は問題ありません

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

testDirいくつかのファイルを含むディレクトリ (file1、file2、file3 など) はどこにありますか。

ただし、Javaで次を使用するとエラーが発生します

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

エラーは

find: missing argument to `-exec'

文字を正しくエスケープしていると思います。いくつかの異なる形式を試しましたが、これを機能させることができません。

更新@jtahlborn は質問に完全に答えました。しかし、md5sum を計算する前にディレクトリ内の各ファイルをソートするようにコマンドが少し変更され、次のようになります (元の質問に対する優れた回答を既に受け入れているので、フォーマットを思い付くことができればビールを購入します)。このために. 以下の答えに従って考えられるすべての組み合わせを試しましたが、成功しませんでした.)

「testDir を検索 -type f -exec md5sum {} + | awk {print $1} | sort | md5sum ;」

新しいアップデート

パイプの場合、シェルが必要なので、最終的にこれになりました。これはうまく機能し、それでも出力を得ることができます。

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"
});
4

2 に答える 2

5

exec への複数引数呼び出しを使用します (そうしないと、エスケープ規則に噛まれる可能性があります)。また、シェル スクリプトから呼び出していないため、セミコロンをエスケープする必要はありません。

Process pr = rt.exec(new String[]{"find", "testDir", "-type", "f", "-exec", "md5sum", "{}", ";"});
于 2012-05-22T15:18:19.503 に答える
0

パイプのようなものには、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"
});
于 2012-05-23T11:50:37.090 に答える