0

Runtime.getRuntime()。exec();を実行したい。Javaで、あるディレクトリのファイルを一覧表示します。

したがって、このコマンド "ls / mnt / drbd7 / i * | tail -1"を渡したいのですが、スターのため、コマンドはnullを返します。そして、私は本当にこの星が必要です。ディレクトリで最後に変更されたファイルを選択する必要があります。java.io.Fileを使おうとしましたが、最後のファイルを取得できません。

誰かヒントがありますか?前もって感謝します!フェリペ

4

4 に答える 4

2

bashシェルを介してコマンドを渡す必要があります。これglobにより、ワイルドカードをファイルリストに変換できます。

Runtime.getRuntime().exec(new String[]{ "/bin/bash", "-c", "ls", "/mnt/drbd7/i*", "|", "tail", "-1"});
于 2013-02-21T20:18:24.357 に答える
1

星を展開するシェルにコマンドを渡す必要があります—そしてパイプ記号を解釈します。1つではなく、2つのプロセスを開始しています。

bash -c ls /mnt/drbd7/i* | tail -1
于 2013-02-21T20:18:12.623 に答える
1

デフォルトでは、コマンドは結果を名前でソートするため、コマンドls /mnt/drbd7/i* | tail -1は最後に変更されたファイルを表示しません。ls代わりに行うことができますls -t /mnt/drbd7/i* | head -1

この質問への回答を使用できます。

Javaのディレクトリで最後に変更されたファイルを見つけるにはどうすればよいですか?

于 2013-02-21T20:31:07.547 に答える
0

Unixでは、コマンドラインパラメータのようなパターン*?、個々のプログラムではなく、コマンドシェルによって拡張されます。ワイルドカードの処理方法を知っているプログラムにはいくつかの例外がありますがls、それらの1つではありません。同じことがパイプにも当てはまります。シェルはパイプの処理方法を知っていますが、そうでjava.lang.Runtimeはありません。

したがって、これらの機能を使用する場合は、次のような操作を行う必要があります。

Runtime.getRuntime().exec("/bin/sh -c 'ls /mnt/drbd7/i* | tail -1'")

ただし、これは純粋なJava(、などを参照)を使用して解決できる問題に対する非常にシステム固有の解決策(現在のユーザーの構成にも依存します)であることに注意してjava.io.File.listFilesくださいjava.nio.file.DirectoryStream

于 2013-02-21T20:51:55.750 に答える