- ベストアンサー
条件にあった特定のファイルのフォルダ名を得る
よろしくお願いします。 階層的に存在するファイル(すべて同名)で、条件にあった記述がされているファイルのフォルダ名を得たいのですが、どのような方法が考えられるでしょうか? 漠然とした質問で申し訳ありません。 例えば、 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 使用) 以上、よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ヒント: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 ----------------------------------------------------------------------- この結果を元にチェックを行うとらくだと思います。 あとは自分で頑張ってみてください。
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
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"); とか, かなぁ?
- Sucelggug(@xyz37005)
- ベストアンサー率51% (368/714)
私が書いたのは、質問者さんの言われる処理の全体ではなく フォルダのツリー構成を調べる方法です。フォルダのツリー構成さえわかっていれば、 指定の記述があるファイルのチェックも容易になりパスを表示させるのは容易になります。 それから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)
全然 Perl じゃない方法で: シェルにもよりますが, bsh なら find /TEST -name TEST.txt |xargs grep -l dummy /dev/null |while read f; do dirname $f; done でいけませんか?
お礼
すみません、既に他の処理をPerlで実行しているのでできれば1つのプログラムで解決したくて・・・ ご回答ありがとうございました。
- bonyamk
- ベストアンサー率29% (49/166)
foreach(<*.*>){ next if(-f $_); foreach(<$_/*.*>){ if(-f $_) { open(FH,"< $_"); foreach(<FH>) { if(/dummy/) { #見っけ! } } close(FH); } } } 物凄い適当にかいちゃいましたが これを見て考えてみましょう^^ これをサブルーチンにして再帰的呼び出しすれば もっと深い階層にも対応できます がんばってください^^
お礼
ニュアンス的にこんな感じですね。。。 ご参考にさせていただきます。 ご回答ありがとうございました。
お礼
すみません、少し思っていたものと違いました・・・ 今後に生かしたいと思います。 ご回答ありがとうございました。