• 締切済み

execからのls grepコマンドについて

PHPで階層になっているディレクトリ名をすべて取得するプログラムを作成しています。 ディレクトリ数、ファイル数が非常に多いので動作速度向上のためにlinuxコマンドで取得するために以下の命令を記述しました。 exec("ls -l | grep '^d' ./hogehoge/hugahuga/",$aDir); var_dump($aDir); これを実行しても $aDirに値が入りません。 どうすれば望みどおりの結果になるでしょうか。

  • PHP
  • 回答数3
  • ありがとう数0

みんなの回答

  • _yasuo
  • ベストアンサー率41% (16/39)
回答No.3

exec("find ./hogehoge/hugahuga/ type -d",$aDir); ではどうですかね?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「どういう事でしょうか?」と聞き返すより前に, 実際に実行してみればわかると思うのだが.... 「grepを付けずに実行したら動作した」とは, 具体的にはどのようなコマンドを入力して「うまくいく」ことを確認したの? そして, それでうまくいったからといってなぜ「grep をつけて『当然』うまくいくと思った」の?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

えぇと.... コマンドラインから ls -l | grep '^d' ./hogehoge/hugahuga/ と入力してもまともな結果になりそうもないことは当然認識できてますよね?

george723
質問者

補足

どういう事でしょうか? grepを付けずに実行したら動作したので当然うまく行くものだと認識していましたが。

関連するQ&A

  • コマンド ls について

    linux初心者です。 調べたのですが、出てこなかったので知っている方がいらっしゃったら。 linux コマンドで ls というものがあると思いますが、オプションで -la をつけた際に表示される "." ".." の2つのディレクトリ??はいったい何を意味している(というより何?)のでしょうか。 パーミッションも付与されているみたいなので、ファイルかディレクトかなのでしょうか? ls で検索しても出てこなかったので(manも読みましたがそれらしいものはなかったので)、ちょっと無知な感じですがご回答よろしくお願いいたします。

  • grepの使い方

    "A.lst"と"B.lst"の2つのファイルがあります。 ともにディレクトリ階層の一覧が記述されています。 2つのファイルを比較して、A.lstのディレクトリ階層の文字列を 含む行を、B.lstから抽出して、リダイレクトで出力するには、 どういうコマンド操作になるのでしょうか。 特定の文字列ならば単純に、cat B.lst | grep moziretsu > sample.lst でいいわけですが、この文字列がA.lstファイル内に複数行あり、 それを順にgrepするにはどうすればいいのかがわかりません。 シェルもただいま勉強中です。 よろしくご教授願います。

  • phpからlinuxコマンドを実行したい

    CentOS6で test.phpを作成しました。 <?php $buf = ''; exec("yum list installed | grep php | cut -d' ' -f1", $buf);   var_dump($buf[0]); ?> コマンド:php test.php を実行したのですが、実行結果が帰ってきません。 (当然phpをインストールしているので、パッケージは導入されています。) 多分「’」がうまく機能してないのだと思うのですが、 どのように記述すればコマンドの実行結果が表示されるのでしょうか ご教授お願いします。

  • ある特定のディレクトリの特定の文字を含むファイルを検索するには

    Debian Linuxでbashスクリプトを記述しています。 特定のディレクトリ(1つの階層)にある ".abc"で始まる隠しファイルの一覧と、 それぞれのファイル内容を取得したいのですが ・サブディレクトリも検索してしまう。  find の-pruneやmaxdepthがききません。 lsで記述しなおしましたが ・結果を確認すると、6回同じ内容を記述しています。  正規表現が正しくないと思い書きなおしていますがうまくいきません。 target=/var/test filename=$(ls -a ${target} -name | grep '\.abc' | grep -v "~") kugirimoji="------" for i in $filename ; do echo $i cat $i echo $kugirimoji done どこを直せば、単一ディレクトリの特定ファイルの一覧を検索できるでしょうか。 同じ内容を複数回吐き出すのは、やはり正規表現が間違っているからでしょうか。 ぜひ教えて下さい。 どうぞよろしくお願い致します。

  • lsで上の方が流れて見えない

    Linuxのlsコマンドででディレクトリリストの表示をしてみたんですが、たくさんあるせいで流れてしまって上の方が見えません。自動スクロールせずに、何かを押すごとに下の方が見れるようなスイッチはありませんか?

  • unixのfindコマンド

    unixのfindコマンドで、ある複数のディレクトリから指定のファイル名だけを 検索し、その結果をgrepしたいのですが、 例えば 01_dir 02_dir : 11_di : 21_dir : と言うディレクトリがあります。 そこから、「0」で始まっているディレクトリの中なら拡張子が*.txtを 検索し、その検索したファイルに対して、grepを実行したいのですが、 上手くいきません。 もちろん、各ディレクトリには、「.txt」以外のファイルもありますし、 ファイル名にも条件を付与したいです。 以下の様に、 find . -name "0*_dir" -type d -print | xargs ls -l *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs ls *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls -l '{} /*.txt' | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls {} "検索文字" とやってみたのですがだめでした。 find ./ -type d \( -name '1_*dir' -o -name '2*_dir' -o -name '3*_dir' \) -prune -o -type f -print と「-prune」で除外するディレクトリを指定すればできなくはないですが、 すべてのディレクトリ書くのはいい方法ではないです。 よい方法をお願いします。 OSは、Solaris 11.3です。

  • execでバッチファイル実行の際のコマンド数

    今、exec("a.bat")でバッチファイルをコールしています。 a.batには、「if exist *.log del *.log」(A)という内容を、多数のディレクトリに対して設定したいのですが、(A)を8つ以上羅列すると、固まってしまいます。 コマンド数に制限があるのでしょうか?それとも何か方法があるのでしょうか? すいませんが、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • grep でパラレル検索するには

    あるディレクトリいかに置かれているソースコードの中で特定のパターン (文字列) を含むファイルの一覧を取得するのに grep を使って検索してい るのですが、もう少しよい方法がないかと試行錯誤しています。 [現行法] find . -type f | \ while read line; grep -qP pattern "$line" && echo $line; done そこで、使用しているサーバのCPU 数が8であることに目を付け、マルチ プロセスもしくはマルチスレッドの仕組みを用いて8多重でgrepを実行で きる仕組みを考えています。 最初に考えたのは以下のような方法です。 ・pthread を利用する。 ・各レッドで system 関数を使用して grep を実行する。 ・子プロセスは標準入力をパイプから受け取るようにする。 ・検索対象となるファイル一覧の読み込みは mutex を用いて制御する。 →system 関数はシェル経由で grep をコールするようで、オーバーヘッド が気になるなどの理由により却下。 次に考えたのは以下のような方法です。 ・pthread を利用する。 ・各スレッドで fork し、子プロセスで grep を実行する (exec)。 ・子プロセスは標準入力をパイプから受け取るようにする。 ・検索対象となるファイル一覧の読み込みは mutex を用いて制御する。 →デッドロックの問題が解決できずに断念。 pthread で fork を使う場合は直ぐに exec するようにしないとデッド ロックする可能性があるという記事をネット上で見つけました (標準入力 をパイプから受け取るようにする処理があるため直ぐには exec できな い)。で、実際にもそのようになってしまいました。 そして、最終的に考えているのが以下のような方法です。 ・fork を利用する。 ・各プロセスでさらに fork し、孫プロセスで grep を実行する (exec)。 ・孫プロセスは標準入力をパイプから受け取るようにする。 ・検索対象となるファイル一覧の読み込みはセマフォを用いて制御する。 でも、本当にこのようにマルチプロセス+セマフォを使う方法でしか 「grep でパラレル検索」を実現することはできないのでしょうか? pthread で実現することには失敗してしまいましたが、もう少し改良して 成功できないかと考えているのですが・・・。 (かと言って、あちこち mutex でロックしてしまうと、せっかくのスレッ ドが生かされない?)

  • Linux コマンドの実装箇所

    Linuxコマンドはカーネルのどこで実装がされていますか? 例えば、cd,grep,mkdir,df,・・などなどのコマンドです。 カーネルのソースコードを見ているのですがどこで実装されているのか 分かりませんでした。 例えばcd でディレクトリ移動できますが、これを、aaa で移動できるように設定 したりしたいのです。 カーネルでの実装箇所をおしえてくださいm(___)m

  • DOSプロンプトでLinuxコマンドを使えるようにするには

    Windows XP (SP2)を使っています. 以前はDOSプロンプトでLinuxコマンドが使えたんですが,今は使えません.ディレクトリの中身を見るのもlsでなくdirとうたなくてはなりません. 最近HDDを増設したのに伴い,以前は入れていたCygwinを消してしまいました.これが原因なんでしょうか? もしCygwinをいれないとLinuxコマンドが使えないのであればその旨を教えていただけないでしょうか?再インストールします. 以上,よろしくお願いいたします.

専門家に質問してみよう