• ベストアンサー

find関数が1階層(カレントディレクトリ)にしか利きません。

find関数が1階層(カレントディレクトリ)にしか利きません。 Active Perl+MS-DOS(WindowsXP)の環境です。 深い階層を持つディレクトリAで  find(\&dirfiletotal,'.'); を実行し、特定のファイル名を検出しています。 なぜかカレントディレクトリ(A)にあるファイルに対してしか動作しません。(結果は正常です。) find関数は再帰的、つまり下の階層も含めてファイル検出するのだと思っていましたが、間違いでしょうか? もし間違いであれば、どのように書き変えればいいか、ヒントをいただけると大変助かります。 どうぞ宜しくお願い致します。

  • Perl
  • 回答数2
  • ありがとう数6

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

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

訂正 next EACH_FILES; if $_ =~ /^\.+$/; ↓ next EACH_FILES if $_ =~ /^\.+$/;

rosafilipes
質問者

お礼

_--_1l1_1_様、 懇切丁寧に教えてくださいまして、本当にありがとうございました。 日本語ではNGかも、というポイントは目からウロコでした。 言われてみれば、でやっと思い当たりました。 今後こういうことが起こった時には、まずそれを検証してみます。 いただいたスクリプトのお手本を参考に、勉強しながらさっそく使わせていただきます。 本当にありがとうございます。 大変助かりました!

その他の回答 (1)

回答No.1

File::Findのfindですね。再帰的にファイル階層を辿りますよ。Active Perl は使ったことないですが、フォルダ名が日本語とかダメなんですかね。もしそうでしたら、英数字のみのフォルダとファイル名で試したらでどうでしょうか? あとは自分で作ってみるとか。(以下、空白を全角にしていることに注意) use File::Spec; use File::Basename; my $dir = shift || '.'; my @files = find_files($dir); print $_, $/ for @files; sub find_files {   my ($dir)   = @_;   my $base_name = fileparse($dir);   my @files   = ();   # skip .. ... etc   if ( $base_name =~ /^\.\.+$/ ) {     return ();   }   opendir my $dh, $dir or die "$!:$dir"; EACH_FILES:   for ( readdir $dh ) {     # skip . .. ... etc     next EACH_FILES;     if $_ =~ /^\.+$/;     my $file = File::Spec->catfile( $dir, $_ );     if ( -d $file ) {       push @files, find_files($file);     }     else {       push @files, $file;     }   }   closedir $dh or die "$!:$dir";   return @files; }

関連するQ&A

  • カレントディレクトリの変更に関する質問

    Perlの関数で「chdir」と言うカレントディレクトリを変更する関数を使いたいのですが 今持ってる本を見ると、説明に chdir 式 と書いてあるのですが、その式(引数)には何の式を入力すればいいのでしょうか 出来れば例も示してくだされば嬉しいです (パスの事だと思いパスを引数にしてみましたが、失敗したみたいでした(Find関数内で使用)) ちなみにOSは、WINDOWSです

    • ベストアンサー
    • Perl
  • Perl で ディレクトリ及びサブディレクトリの容量を取得したい

    Perlについて質問します。 Perlで特定のディレクトリ及び、サブディレクトリ全てのファイルの容量を取得する方法についてです。 opendir、readdir関数を使用し指定した階層の合計が表示できたが、それより1つ下の、サブディレクトリはファイルを読み込めませんでした。 どうすればサブディレクトリのファイルも読み込んでもらえるでしょうか。 よろしくお願いします。

  • カレントディレクトリ・・・って?

    こんにちは。ネットで検索したのですが知識が無いためさっぱりわからないので質問させていただきます。 今度、中古ノートPCを入手するに当たり、メーカーのHPからアップデートできるものをダウンロードしました。 「BIOSのアップデート」を解凍したところ、セットアップFDを作り、 しかも、その作業をMS-DOS日本語モードでしなければならず悪戦苦闘しています。 自分のPCが日本語モードになっている事はわかりましたので、FDをフォーマットするまでは出来ました。 次の手順が 「アップデートFD作成ツールを実行します。解凍したファイルがあるカレントディレクトリで実行してください」 っと書いてあり、 解凍されて出来たアプリケーション「~.exe」を実行するようなのですが、その部分がさっぱりわかりません。 ネットでカレントディレクトリなどを検索しまくったのですが、解決できませんでした。 それを入力すると 「ドライブAにフォーマットされたFDをセットして下さい。よろしいですか(Y/N) ?」っと表示されるようなのですが・・・。 現在はMS-DOSプロンプトを開くと「C:¥WINDOWS>」っとなっており、 そのままファイル名を入力し実行すると「コマンドまたはファイル名が違います」っと出ます。 アップデートファイルはデスクトップのフォルダにあります。 わたしのPCはVAIO PCV-R60でOSはWindows98です。 どなたかアドバイスよろしくお願いいたします。

  • Windows 7でのカレントディレクトリについて

    エクスプローラからPerlを起動する際のカレントディレクトリが、Windows 7 (x64) と Windows XPで違ってしまいます。 Windows XPの場合は起動した.plファイルの場所がカレントディレクトリとなり、特に問題はないのですが、Windows7の場合 C:\Windows\System32 がカレントディレクトリになってしまうようです。 以下の前提条件で、Windows 7 でも XPと同様の動作を実現する方法はないでしょうか。 [起動方法] .plファイルを右クリック ⇒「プログラムから開く」⇒ Perl Command Line Interpriter (既定のプログラムはメモ帳に設定) [環境] Windows (7 x64 or XP) + ActivePerl 5.14.2

    • ベストアンサー
    • Perl
  • シェルスクリプト内のcdで、カレントディレクトリを変えるには?

    シェルスクリプト内のcdコマンドで、カレントディレクトリを変えるにはどうしたらいいか?をどうか教えて下さい。 MS-DOSのバッチファイル内で"cd XXXXX"と書き実行した時の動作を、UNIX(CygWin)環境でも行いたいです。 が、シェルスクリプトは(サブシェルで動く為)カレントディレクトリが変わってくれません。aliasコマンド等でいろいろ実験しましたが、DOSバッチファイルのように「バッチファイル単体でディレクトリ移動が出来る方法」を探し出せませんでした。 極めて初歩的とは存じますが、どうか宜しくお願い致します。

  • カレントディレクトリ内のファイル検索

    Windows2003環境で、カレントディレクトリ下に存在するwmvファイル数をカウントしたい。UNIXでいう[find ./ -name *.wmv |wc -l] 何かよい方法はありませんでしょうか?

  • find で探したファイルを探した階層の一つ上へ移動したい

    findコマンドで、深い階層にあるファイルを一階層上へ移動するfindコマンド記述方法を探しています。 /home/user1/text/2007/01/06/text/aaa.txt を /home/user1/text/2007/01/06/aaa.txt へ移動するのが目的です。 ファイルの格納状況は、 /home/user1/text/[1983-2007]/[01-12]/[01-31]/text/ という構造のディレクトリに*.txtが格納されています。 suse10.0, bashです。よろしくお願いいたします。

  • 下の階層のディレクトリーにファイルを作るには?

    はじめまして。 最近、perlの勉強をはじめたばかりの初心者です。 初歩的なことだと思うのですが、分からないことがあったので教えて頂ければ幸いです。 メールアドレスを認証するためのCGIを作っています。 下記は$passwd.htmlという名前のファイルを作って、soudan.htmlの内容を書き込んで保存する部分のスクリプトです。 #乱数htmlを読み込む open(IN,">$passwd.html"); #相談htmlを読み込む open(HTML,"soudan.html"); while($line=<HTML>){ print IN $line }; #乱数htmlを閉じる close(IN); 実行してみるとcgiとおなじファイルに「$passwd.html」ができました。 cgiのあるディレクトリの下の階層にファイルを作りたいと思っていろいろ調べてみたのですが、どのようにしたらいいのかよく分かりませんでした。 cgiのあるディレクトリより下の階層にファイルを作るにはどうしたらいいのでしょうか? 詳しい方、教えて頂ければ幸いです。 あと、こちらのサイトも役立つと思うのですが、oerlのプログラミングで困ったときに相談できる掲示板やサイトなどがありましたら教えてください。

    • ベストアンサー
    • Perl
  • Javaでカレントディレクトリを移動するには?

    Javaの中で、カレントなディレクトリを移動させ、相対PATHで既存ディレクトリを認識させたいのですが、期待する結果が得られません。 Javaの中でカレントディレクトリを移動する場合、System.setProperty()メソッドを利用して、"user.dir"を書き換えれば良いと思ったのですが、間違いでしょうか? 間違いである場合、Javaの中ディレクトリを移動させる方法はあるのでしょうか? 以下のプログラムは、下記状況下にて実行したものです。 C:\Java |-app ←プログラムを実行時にいるフォルダ |-sub ←相対PATHで認識させたい既存フォルダ ----------- ソース -------------------------- import java.io.*; class TestTest { public static void main(String args[]) { System.out.println("Current dir : " + System.getProperty("user.dir")); System.out.println("Move Dir !"); System.setProperty("user.dir","C:\\Java"); System.out.println("Current dir : " + System.getProperty("user.dir")); File f = new File("sub"); System.out.println("Dir existance : " + f.exists()); } } --------------------------------------------- ----------------実行結果---------------------- C:\Java\app>java TestTest Current dir : C:\Java\app Move Dir ! Current dir : C:\Java Dir existance : false ←trueにならない! --------------------------------------------

    • ベストアンサー
    • Java
  • find 指定ディレクトリ以下のファイル数をディレクトリ毎に表示させたい

    ■前提例 ./public_html/rails/modules/abcde/cache/hoge/file1 ./public_html/rails/modules/abcde/cache/file2 ./public_html/ruby/modules/wiki/private/cache/file3 ./net/cache/file4 ./n/abcde/cache/file5  : 以下略 ■期待しているのは、下記二つのディレクトリを検出し、かつそのディレクトリ以下のファイル数を、ディレクトリ毎に表示させたいのですが、 2./public_html/rails/modules/abcde/cache/ 1./n/abcde/cache/  : もしくは、 2./public_html/rails/modules/abcde/cache/hoge/file1 2./public_html/rails/modules/abcde/cache/file2 1./n/abcde/cache/file5  : ■実際に下記コマンドを実行すると、 find . -type f -regex '.*/abcde/cache/.*' -print | wc -l 4503 という数値(恐らくファイル数?)が返ってくるのみです。 ググッてみて、 find . -type f -regex '.*/abcde/cache*/.*' | xargs wc -l find . -type f -regex '.*/abcde/cache/.*' -print | xargs wc -l find . -type f -regex '.*/abcde/cache/.*' -exec wc -l \{\} \; とか色々試してみたのですが、 恐らく行数?が表示されるようで、自分が期待した結果を得ることが できません。 条件で検出したディレクトリ以下のファイル数を、ディレクトリ毎に表示させるには、 どうしたらよいのでしょうか。

専門家に質問してみよう