• ベストアンサー

条件にあった特定のファイルのフォルダ名を得る

よろしくお願いします。 階層的に存在するファイル(すべて同名)で、条件にあった記述がされているファイルのフォルダ名を得たいのですが、どのような方法が考えられるでしょうか? 漠然とした質問で申し訳ありません。 例えば、 TEST--+--A--TEST.txt      |      +--B--TEST.txt      |      +--C--TEST.txt というフォルダ階層でフォルダ"/TEST/A~/TEST/C"があり、それぞれ"TEST.txt"というファイルを持っているとします。 その中の"/TEST/B/TEST.txt"だけ"dummy"という記述が1行あったとするとき、フォルダ名"/TEST/B"を抽出したいのですが何か良い方法はあるでしょうか? (実際の各フォルダ名は規則性なくかなりの量があります) サーバー・・・HP-UX CGI開発言語・・・Perl5 開発端末・・・windows2000(Tera Term 使用) 以上、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

ヒント:UNIX環境であるということを最大限に利用しましょう。 >(実際の各フォルダ名は規則性なくかなりの量があります) ということで、サブフォルダごとにファイル一覧を取得し再帰的に チェックを行っていくことを考えたのですが、もっと楽な方法に気づきました。 UNIXには“ls”コマンドがあるのでそれを使用しましょう。 @result = system( "ls -R $DIR" ) ; これをスクリプト内で実行すれば“ls -R $DIR”を実行した結果が @resultに代入されます。“ls -R”は、その配下にある サブディレクトリごとにファイル一覧を出力してくれます。 ------------------------ ls -R実行例(@result) ------------------------ Diff_test SqlTestDataCreate Test Perl/Diff_test: cwclted_tbfl_up.c cwclted_tbfl_up2.c script Perl/SqlTestDataCreate: SqlTestDataCreate.pl Perl/Test: sample004.pl ----------------------------------------------------------------------- この結果を元にチェックを行うとらくだと思います。 あとは自分で頑張ってみてください。

kal1119
質問者

お礼

すみません、少し思っていたものと違いました・・・ 今後に生かしたいと思います。 ご回答ありがとうございました。

その他の回答 (4)

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

use File::Find; my @ans = (); sub checkDummy() { if ($_ =~ /^TEST.txt$/) { open(F, "$File::Find::name"); while (my $line = <F>) { if ($line =~ /dummy/) { push(@ans, $File::Find::dir); last; } } } } find(\&checkDummy, "/TEST"); とか, かなぁ?

回答No.4

私が書いたのは、質問者さんの言われる処理の全体ではなく フォルダのツリー構成を調べる方法です。フォルダのツリー構成さえわかっていれば、 指定の記述があるファイルのチェックも容易になりパスを表示させるのは容易になります。 それからNo.3さんの書いたコマンドをPerlで実行させてその結果を得ることも出来ますよ。 @result = system( "find /TEST -name TEST.txt |xargs grep -l dummy /dev/null |while read f; do dirname $f; done" ) ;

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

全然 Perl じゃない方法で: シェルにもよりますが, bsh なら find /TEST -name TEST.txt |xargs grep -l dummy /dev/null |while read f; do dirname $f; done でいけませんか?

kal1119
質問者

お礼

すみません、既に他の処理をPerlで実行しているのでできれば1つのプログラムで解決したくて・・・ ご回答ありがとうございました。

  • bonyamk
  • ベストアンサー率29% (49/166)
回答No.1

foreach(<*.*>){ next if(-f $_); foreach(<$_/*.*>){ if(-f $_) { open(FH,"< $_"); foreach(<FH>) { if(/dummy/) { #見っけ! } } close(FH); } } } 物凄い適当にかいちゃいましたが これを見て考えてみましょう^^ これをサブルーチンにして再帰的呼び出しすれば もっと深い階層にも対応できます がんばってください^^

kal1119
質問者

お礼

ニュアンス的にこんな感じですね。。。 ご参考にさせていただきます。 ご回答ありがとうございました。

関連するQ&A