javaからunixのシェルに正規表現の*を引き渡す

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,229

TOKKIYNET

score 14

前提・実現したいこと

javaでunixの正規表現の*をシェルに引き渡し
実行させ、結果をコンソールに表示させる。

発生している問題・エラーメッセージ

なにも表示されない

該当のソースコード

package commandSample;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
/*

  • コマンドを実行し
  • 実行結果を表示させるクラス
  • */
    public class CommandProcess {

public static void main(String[] args) throws IOException {
Runtime runtime = Runtime.getRuntime();
Process p = runtime.exec("ls *.csv");//作業ディレクトリはプロジェクトの直下で行われる
display(p);

}

public static void display(Process p) throws IOException{
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "Shift_JIS"));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}

試したこと

いろいろ試しましたがわかりませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

端末はmacです。

ちなみに表示させたいディレクトリ内は
B.csv            classes            logging.properties
LoggerTester.log    docs            src
bin            lib

こうなっています。
なので表示結果はB.csvとならないといけないのですがなりません。

コマンドプロンプトではもちろん成功しましたが、eclipseのコンソール上だと表示されませんでした。
ご教授お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

ここでのアスタリスクは正規表現ではなくワイルドカードであり、これを展開するのはシェルの役割になるため、質問にあるようなプログラムだと名前が「*」のファイルの情報を表示するという処理になります。

ワイルドカードを使用するのであれば以下のようにシェルにコマンド文字列を渡すように記述する必要があります。

//
        //コマンド文字列の区切りを都合よく解釈してくれないので、文字の配列にして引き渡す必要あり。
        Process p = runtime.exec(new String[]{"sh", "-c", "ls *.csv"});

        //java1.5以降はProcessBuilder推奨
        Process p = new ProcessBuilder("sh", "-c", "ls *.csv").start();

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/03 08:50

    ありがとうございます!笑
    解決しました!

    キャンセル

+1

プロセスから実行するコマンドを、ls で出力されるファイル一覧を見るか、pwd を実行してコマンドを実行しているディレクトリが想定されている場所なのかを判断してみると良いでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/02 19:46

    はい、想定させる場所で行われています。
    Process p = runtime.exec("ls B.csv");//作業ディレクトリはプロジェクトの直下で行われる
    display(p);
    こうするとB.csvというのがコンソールに表示されるのですが
    "ls *.csv"とすると表示されないのです。
    だから、正規表現が問題かなと考えています。

    他に思い当たる節とかあったらご教授いただきたいです。

    キャンセル

0

ちなみに、パイプを使って grep でいけるんじゃね?
って思ったけど、どうやら tkmtmktさんの方法をとらないと
だめのようです。まあ、パイプもシェルの機能ですからねえ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/03 09:00

    解決しました!
    回答ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる