これからの季節に親子でハイキング! >>

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で質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDirコマンドでフォルダ内ファイルの合計サイズをだすには?(コマンドプロンプトにて)

いろいろ調べましたが不明な点があり、質問します。

WindowsのDOSプロンプトでdirコマンドを打つとフォルダ・ファイルの一覧が表示されますが、その中にファイルサイズが表示されています。
このサイズを合計できるコマンドはありませんか?
DIRコマンドのオプションを調べましたがそれらしいものが見当たりません。
具体的には
C:\xxx\配下に50個程度のファイルがあります。
その50個の合計サイズを知りたいです。
xxxフォルダの親フォルダにはアクセス不可です。

ずーっと悩んでいます。よろしくお願いします。

なお、OSはWindowsNTか2000で使用予定です。

Aベストアンサー

カレントドライブ、カレントフォルダを
C:\xxx\
にした状態で、

dir /s /a-d

/sパラメータででサブディレクトリすべてを検索
/a-dパラメータでディレクトリ以外のファイル(つまり属性に関係なくすべてのファイル

これを実行すると最後にファイルの個数とファイルサイズの合計を表示します。

もし、隠し属性のファイルは合計しないのであれば、

dir /s

だけで良いと思われます。

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Qディスクの空き容量を求める(Win/Linux共通)

指定ディスクの空きディスクの容量を求める処理として、
Windowsでは、Win32::OLE を使って求められることをこちらで教えて頂きました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1780512

同様なことをLinuxで実施するにはどうすれば良いでしょうか。
単純には、Linuxでは、dfコマンドなどを``バッククォートで実行して処理すれば良さそうですが、
できれば、Windows/Linux で共通のスクリプトとして書けたらと思っています。

方法があれば、教えてください。よろしくお願いします。

Aベストアンサー

CPAN の Filesys::DfPortable は、御希望そのものでは?

参考URL:http://search.cpan.org/~iguthrie/Filesys-DfPortable-0.85/DfPortable.pm

Q上位ディレクトリ名(フォルダ名)を取得するには?

phpファイルが入っている、2階層上位のディレクトリ名(フォルダ名)を取得したいと思っています。


http://~.com/aaa/bbb/ccc/test.php

test.phpが本体です。
ここから2階層上位のディレクトリ名、ここでは「bbb」を取得するような事はできないでしょうか?
test.phpの中に、2階層上位のディレクトリ名を記述したいと思っています。

具体的に言うと、
$name = "●●●";
上記の●●●に、2階層上位のディレクトリ名を入れたいです。


同じようなファイルが多数あり、「bbb」には様々なフォルダ名があり、test.phpの1つ1つを書き換えるのに手間がかかるので、ディレクトリ名を自動的に取得できれば助かります。


phpの知識がほとんどないため、お力をお借りできればと思い、質問させて頂きました。

アドバイスをお願い致します。

Aベストアンサー

自URL取得してそれを / で分割(split)する。
で、後ろから3つめがそれにあたるのではないかと思われます。

$list = split( "/", $_SERVER[ SCRIPT_NAME ] );
$name = $list[ count( $list ) - 3 ];

Q機種依存文字の文字コード変換

現在、Shift-JISでCGIを作成しています。言語はPerlです。HTMLファイルから送信された文字をDBに登録するのですが、CGIをShift-JISで作成しているのに、DBがEUCとなっているため、jcode.plを利用して文字コードを変換しています。
しかし、文字が機種依存文字である場合、jcode.plでは文字コード変換ができないようで文字化けを起こした文字をDBに登録しようとしてエラーを起こしてしまいます。
何とか機種依存文字をコード変換したいのですが、可能でしょうか?

Aベストアンサー

Unicode::Japanese はご存知ですか?
”はしごだか”などの環境依存文字が混在する場合Jcodeでは変換できませんので、Unicode::Japaneseを使うと便利です。

http://search.cpan.org/~hio/Unicode-Japanese-0.40/

PurePerlとしても動作するので、サーバへのインストールも不要です。上記アドレスからDL・解凍後、lib内の Japanese.pm をコピーしてきて利用元のソースと同じパスに置く、あるいは任意のパスに置いてuse libするだけで利用可能です。


use Unicode::Japanese;

my $x = "変換元文字列";
my $s = Unicode::Japanese->new($x, "sjis");

open(FILE, ">./euc.txt");
print FILE $s->euc;
close(FILE);

こんな感じ。使い方はJcodeとほぼ同じです。

参考URL:http://search.cpan.org/~hio/Unicode-Japanese-0.40/

Unicode::Japanese はご存知ですか?
”はしごだか”などの環境依存文字が混在する場合Jcodeでは変換できませんので、Unicode::Japaneseを使うと便利です。

http://search.cpan.org/~hio/Unicode-Japanese-0.40/

PurePerlとしても動作するので、サーバへのインストールも不要です。上記アドレスからDL・解凍後、lib内の Japanese.pm をコピーしてきて利用元のソースと同じパスに置く、あるいは任意のパスに置いてuse libするだけで利用可能です。


use Unicode::Japanese;

my $x = "変換元文字列";
m...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。


人気Q&Aランキング