ディレクトリ全てのファイルを読み取るには?

このQ&Aのポイント
  • フリーのCGI掲示板を使っています。ディレクトリ内に複数のログファイルがあるため、一括して編集・削除ができるように管理部分を改造したいです。一応、readdir関数でディレクトリ内にある全てのファイル名を取得することは分かりましたが、open関数で全てのファイルを読み取らせる方法がわかりません。
  • ディレクトリ内の全てのファイルを読み取る方法を教えてください。CGI掲示板で使用しているディレクトリ内には複数のログファイルがあり、これらのファイルを一括で処理したいと考えています。readdir関数を使用してファイル名を取得することはできましたが、それぞれのファイルをopen関数で読み取る方法が分かりません。
  • フリーのCGI掲示板を使っています。ディレクトリ内に複数のログファイルがあり、これらのファイルを一括して編集・削除したいと考えています。readdir関数を使用してファイル名を取得することはできましたが、open関数で全てのファイルを読み取らせる方法が分かりません。どのようにすれば実現できるでしょうか?
回答を見る
  • ベストアンサー

ディレクトリ全てのファイルを読み取るには?

フリーのCGI掲示板を使ってます。ディレクトリ内に複数のログファイルがあるので、一括して編集・削除ができるように管理部分を改造したいのでアドバイスをお願いします。 一応、readdir関数でディレクトリ内にある全てのファイル名を取得でることは分かりましたが、open関数で全てのファイルを読み取らせる方法がわかりません。 open DIR "./log"; @files = readdir DIR; close DIR; #以下、オリジナルのソースです。 open(IN,"$logfile") || &error("Open Error: $logfile"); while (<IN>) { my ($no,$dat,$nam,$eml,$sub,$com,$url,$hos) = split(/<>/); #途中略 } close(IN);

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

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

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

エラー処理はオリジナルの&error()を使ったほうがよいかもしれないけど use File::Spec; my $dir = './log'; opendir my $dh, $dir or die "$dir:$!"; for ( readdir $dh ) { my $file = File::Spec->catfile( $dir, $_ ); if ( !-f $file or !-r $file) { print "$file is not file or readable\n"; next; } print "\n--- $file\n"; open my $fh, '<', $file or die "$file:$!"; while ( defined( my $line = <$fh> ) ) { # 処理 # print $line; # my ($no,$dat,$nam,$eml,$sub,$com,$url,$hos) = split /<>/, $line; # ... } close $fh or die "$file:$!"; } closedir $dh or die "$dir:$!";

umistu
質問者

お礼

ありがとうございます。 参考にさせていただいた結果、試行錯誤の末にようやく完成しました!

その他の回答 (1)

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

「一気に全てのファイルを読み込む」ことはできないので, 1つずつ読み込んでください.

関連するQ&A

  • readdir()で得られるファイル・ディレクトリ情報の順番は?

    Perlプログラムにて、  opendir(DIR, '.');  @dir_list = readdir(DIR);  closedir(DIR); などとすると、そのディレクトリにあるファイルとディレクトリの一覧情報を得ることができますが、この場合、@dir_list にはどのような順番で情報が格納されるのでしょうか? readdir() 関数の仕様が知りたいです。ご存知の方、ぜひ教えてください。

    • ベストアンサー
    • Perl
  • ファイル読み込み・書き込み

    下記のようにtestディレクトリ内のファイルを読み込み、 それぞれにあるデータを足して、 読み込んだファイルを他のディレクトリに書き出したいのですが、 どのようにしたらよいのでしょうか。 とりあえず、下記はファイルを読み込んで、 なにも足さずそのまま別のディレクトリに移すとこまで、 やりたいと思っていますが、 どうやっていいものか・・・ #!/usr/bin/perl $dir = "test/"; opendir(DIR, $dir); while($file = readdir(DIR)){ open(IN, ">>$dir$file"); @list = <IN>; foreach $dataLine(@list) { print IN $dataLine; } close(IN); } closedir(DIR); ようはファイルに追記したいのですが、 上書きしないで、バックをとっておき、 別のところへ追記したバージョンを生成したいということです。 ご協力お願いします。

    • ベストアンサー
    • Perl
  • 下のディレクトリ(3つ)に含まれる同じファイル名のテキストを結合し,カレントディレクトリに出力する

    いつもお世話になっております.環境はWindows XPのActiveperlです. やりたいことは「下のディレクトリ(3つ)に含まれる同じファイル名のテキストを結合し,カレントディレクトリに出力する」ことです.具体的にはいかのようにしたいと思っています. 現在のディレクトリ/a/1.txt a b c 現在のディレクトリ/b/1.txt d e f 現在のディレクトリ/c/1.txt g h i 現在のディレクトリ/1.txt a b c d e f g h i ここで私は以下のプログラムを作成しました. use strict; use warnings; my $dirname1 = './a/'; my $dirname2 = './b/'; my $dirname3 = './c/'; opendir(DIR1, $dirname1) or die "$dirname1: $!"; while (my $dir1 = readdir(DIR1)) { next unless (-f $dir1); next unless ($dir1 =~ /\.txt$/); opendir(DIR2, $dirname2) or die "$dirname2: $!"; while (my $dir2 = readdir(DIR2)) { next unless (-f $dir2); next unless ($dir2 =~ /\.txt$/); opendir(DIR3, $dirname3) or die "$dirname3: $!"; while (my $dir3 = readdir(DIR3)) { next unless (-f $dir3); next unless ($dir3 =~ /\.txt$/); if (($dir1 == $dir2) && ($dir2 == $dir3)){ open(FILE1, $dir1) or die "$dir1: $!"; my $line1 = <FILE1>; close(FILE1); open(FILE2, $dir2) or die "$dir2: $!"; my $line2 = <FILE2>; close(FILE2); open(FILE3, $dir3) or die "$dir3: $!"; my $line3 = <FILE3>; close(FILE3); my $joint_line = $line1.$line2.$line3; open(NEWFILE, "> $dir1") or die "$dir1: $!"; print NEWFILE $joint_line; close(NEWFILE); } } } } closedir(DIR1); closedir(DIR2); closedir(DIR3); ですが,以下のようなエラーが発生しています. closedir() attempted on invalid dirhandle DIR2 at joint.pl line 51. closedir() attempted on invalid dirhandle DIR3 at joint.pl line 52. ディレクトリハンドルが使われているけれど閉じているか実際にはディレクトリハンドルでは無い時にこれらの警告が発行されるとこの警告がでるようですが,どのようにしたら解決できるのでしょうか.よろしくお願いします.

  • ファイル名に『?』が入ってるファイルを開くには?

    ファイル名に半角の『?』が入ってるファイルには アクセスできないでしょうか? opendir(DIR, "./dir"); @list = grep(!/^\./, readdir(DIR)); close(DIR); ディレクトリにあるファイルのリストを取得して、 そのリストに基づいて処理をしたいのですが… ファイル名に『?』が入ってるファイルは、 open(); rename(); ファイル演算子等の処理できません。 これをなんとかする方法はあるのでしょうか?

    • ベストアンサー
    • Perl
  • アンケートの回答のすべての項目をcsv保存するには?

    下記の内容ではemailしか保存されません。送信フォームには他にnameとcommentがあります。すべてを保存するにはどこに何を追加すればよいでしょうか。 ↓以下csv書き込みの記述抜粋 ----- $logfile = 'logfile'.'.csv';#(ファイル名変更推奨) $log_permissions = 0666; # ファイルが存在しなければ、作成後アクセス権設定してヘッダー書き込み if (-e $logfile) { }else{ open(LOG,">$logfile") || &error("logfile create error!"); chmod $log_permissions, $logfile if $log_permissions; if ($log_header) { print LOG $log_header };#ヘッダー不要ならこの行は削除 } # 出力 open(LOG, ">>$logfile") || &error("logfile open error!"); foreach $i (1..(@key)) { print LOG "$val[$i]".','; } print LOG "\n"; close(LOG); -----

    • ベストアンサー
    • CGI
  • ディレクトリ内のテキストファイルに対する同一処理

    よろしくお願いします。現在Linuxの環境でテキスト処理をしております。 ディレクトリ内にファイル名の異なった以下のような大量ファイルがあります。 a.txt 0,1,2,3,4,5,6,7 1,2,3,4,5,6,7,8 b.txt 2,3,4,5,6,7,8,9 3,4,5,6,7,8,9,10 これらのファイルをカンマでsplitし、左から2番目の数にだけ1を引き,下のディレクトリであるoutに出力させます。出力は以下のようになります。 ./out/a.txt 0,0,2,3,4,5,6,7 1,2,3,4,5,6,7,8 ./out/b.txt 2,2,4,5,6,7,8,9 3,4,5,6,7,8,9,10 そこで以下のようなPerlのプログラムを作成しました。 use strict; use warnings; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); print $dir, "\n"; open(FILE, $dir) or die "$dir: $!"; my @file = <FILE>; foreach $line (@file) { my ($a,$b,$c,$d,$e,$f,$g,$h) = split(/,/, $line);      my $b = $b - 1; close(FILE); } open(NEWFILE, "> ./out/$dir") or die "$dir: $!"; print NEWFILE @file; close(NEWFILE); } closedir(DIR); ですが、出力は完了するのですが、元のファイルから計算がされていません。どこがどう間違えているのかご指摘よろしくお願い申し上げます。

    • ベストアンサー
    • Perl
  • ファイルとディレクトリの見分け方は?

    環境  WindowsXP、Apache2.0.47、PHP4.3.2で使用しています。 質問  関数readdir($dh)で指定されたパスのファイルとディレクトリのリストを取得しています。  両方が存在していた場合、ファイルとディレクトリを見分けるためにはどのようにしたら良いのでしょうか?  都合の良い関数は無いように思ったのですが... よろしくお願いします。

    • ベストアンサー
    • PHP
  • ディレクトリ内の拡張子指定ファイル移動

    自分では難解で、同じような質問がなかったため質問します。私は新米です。 ルートディレクトリ(./)内の拡張子が『.send』のファイルを全て別のディレクトリ(./back)に移動するクーロンを組もうと思っているのですが、ルートディレクトリのパーミッションが750のためか下記のスクリプトですと、copyの行及びunlinkの行でPermission deniedのエラーが出ます。 ./backディレクトリに関しては777にしています。 ルートディレクトリのパーミッションはサーバーの仕様で変えられないのですが、何か有効がありますでしょうか?どうかご教授ください。 <?PHP if ($dir = opendir("./")) { while (($file = readdir($dir)) !== false) { if(preg_match("/.send/",$file)) { copy("./".$file,"./back".$file); unlink("./".$file); } } closedir($dir); } ?>

    • ベストアンサー
    • PHP
  • ディレクトリ内CSVデータをすべてまとめる

    スクリプトの存在するディレクトリ /home/XXXX/XXXX/log.pl(完全に固定のディレクトリ) csvファイルの存在するディレクトリ /home/XXXX/XXXX/XXXX/****/YYMMDD.csv(Xは固定*は不定) crontabでCSVファイルを /home/XXXX/XXXX/XXXX/****/ 内のcsvをすべて読み込み時間が古いものを下に 新しい物を上にして /home/XXXX/XXXX/XXXX/****/fix.csv として新たなファイルを生成する。 既に読んだことのあるYYMMDD.csvファイルは再度 fix.csvに書き込まない 次のディレクトリがあるならばディレクトリ内のファイルを読み込み同様の動作をする 以前教えていただいたスクリプトを元にここまでできました。 logファイルに書き込まれている名前のファイルは読み込まないようにしたいのですが どのようにすればいいのでしょうか ▽▽以下スクリプト chdir'/home/XXXX/XXXX/XXXX/'; @files1=reverse(@files1); chomp(@files1); $file1=shift(@files1); until(("" eq $file1)){ @parts1=split(/\//, $file1); open(READLOG,"./$parts1[1]/log"); close(READLOG); open(READFILE,"<./$parts1[1]/$parts1[2]")||die "1$!"; @f1=<READFILE>; close(READFILE); @f=sort(@f1); open(WRITEFILE,">>./$parts1[1]/fix.csv")||die "3$!"; foreach $str (@f){ print WRITEFILE "$str"; } close(WRITEFILE); $file1=shift(@files1); #次のファイル名の取り出し open(BKFILE,">>./$parts1[1]/log")||die "3$!"; print BKFILE $parts1[2]."\n"; close(BKEFILE); } △△以上

    • ベストアンサー
    • Perl
  • ファイルの書き込み

    以下のことがしたいです。 testフォルダよりテキストファイル達を読み込み、 ある行だけ取り除いたのちnewtestフォルダに書き出したいと思います。 以下、コードになります。 #!/usr/bin/perl $n_dir = "newtest/"; $b_dir = "test/"; opendir(DIR, $b_dir); while($file = readdir(DIR)){ $nfile="$n_dir$file"; $bfile="$b_dir$file"; if (-T $bfile) { open(IN, $bfile); #testフォルダよりファイルの読み込み @list = <IN>; close(IN); open(OUT,">$nfile"); #newtestフォルダに書き出し while(@list = <IN>) { #testフォルダ内のファイルを一行ずつ読み込み if (@list =~ /test/) { #行にtestという文字列があるぎょうだけ書き出し print OUT @list; } } close(OUT); } else{next;} } closedir(DIR); ということをやりたいのですが、 書き出されるファイルは空です。 どこが間違っているのでしょうか。 エラーなどは特にありません。 testフォルダのファイル達が そのままnewtestフォルダに書き出されるのですが、 中身は空です。 ご協力お願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう