この人頭いいなと思ったエピソード

Perlについて質問します。
Perlで特定のディレクトリ及び、サブディレクトリ全てのファイルの容量を取得する方法についてです。

opendir、readdir関数を使用し指定した階層の合計が表示できたが、それより1つ下の、サブディレクトリはファイルを読み込めませんでした。

どうすればサブディレクトリのファイルも読み込んでもらえるでしょうか。
よろしくお願いします。

A 回答 (3件)

> Permission denied


って文句たれてるんで、自分がそこには入れないディレクトリだったりしません?

お手数ですが、
・使っているOS
・実行時の操作
(シェルのコマンドラインから実行しているとか、cron経由で起動してるとか)

を説明してもらえますか?

> /ファイルパス/ 行番号 54.

まあ本当の名前そのまま書かないでもいいんですが、
この54行目でエラーになっているというファイルはどんなファイルですか?
自分で作った(File::Findを使っている)スクリプトのファイルですか?
それとも別の何かですか?

まず適当な作業ディレクトリに移って、
そこで3段くらいのディレクトリ構造と幾つかのダミーファイルを置いてみて、
シェルからスクリプトを実行して正しく動作するか確認してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

実行する形はCGIファイル(index.cgi)としてサーバーにアップしています。
ファイルアクセスして実行します。

また、エラーが発生する時はディレクトリのパスを通し、且つfind(\&wanted ~)を記入したときのみ発生していましたので、やはりアクセス権限などに関わるかと思われます。

しかし、ディレクトリに関してはこちらの所有でありパーミッションも777に設定したにもかかわらずエラーが発生しています。

もしかしたら僕が使用しているサーバーのPerlのバージョンがFile::Findに対応していないのかと、考えていますが
原因は不明でいます。

エラーに関しましてはindex.cgiファイル内の54行目で起こっていると記述されています。
しかし、54行目は特にディレクトリ探索に絡むようなスクリプトでは無いため、ただ単純に誤認と考えています。

--------------------------------------------
#-- ディレクトリを指定(複数の指定可能) --#
@directories_to_search = ('./');
#-- 実行 --#
find(\&wanted, @directories_to_search);
--------------------------------------------

懇切にアドバイスありがとうございました。
File::Findのエラーは解決できませんでしたが、別の方法を用いて
無事解決致しました。
ただ、このエラーは気になる所ではありますのでもう少し検討してみようと思います。

お礼日時:2008/01/23 13:14

まあモジュール使うのがお手軽だと思うんですが、自前でやるなら




あるディレクトリのサイズ合計を求める手順を関数にし、
readdir でそのディレクトリに属するエントリを取得して
一つ一つチェックしていって、ファイルだったらサイズ加算
ディレクトリが見つかったらそこで自分自身を(見つかったディレクトリを引数にして)
呼び出すという感じですね。
    • good
    • 0
この回答へのお礼

ありがとうございます。

このページ(http://katsubemakito.net/cgiperl/directory/perl2 …)を参照し、File::Find;を使用したのですが、結果として『Can't cd to : Permission denied
Compilation failed in require at /ファイルパス/ 行番号 54.
』と表示されてしまいます。

find(\&wanted, @directories_to_search);と実行するとエラーが発生します。

エラー画面にディレクトリとファイル一覧が表示されていましたから、動作はしていると考えられますが、エラーの原因がわからずにいます・・・

お礼日時:2008/01/22 11:07

1. 地道に再帰的に処理する


2. 地道に繰り返しで処理する
3. File::Find
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
更に質問でもうしわけないのですが、どのようにして実現できるのでしょうか。

$dir = "test";
opendir(DIR, "$dir");
@ls = readdir(DIR);
closedir(DIR);
でディレクトリを@lsに格納し

foreach $line (@ls) {
$filesize = (-s $dir.'/'.$line);
$totalsize = $totalsize + $filesize;
}
でファイルの合計を出す。
if ($totalsize > $max) {
$caution = "ファイルサイズオーバーです。";
}
後は、前もって定めた容量を超えていたらメッセージを出す。

しかし、これだけでは$dirの階層しか読まれないため、
具体的にどのように組めばわからずにいます。

初心な質問ですみませんが、よろしくお願いします。

お礼日時:2008/01/21 22:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!