人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Perlに関しての質問です。

「フォルダ内にあるファイル名を調べたい」

という前回の質問に類似しているのですが、

「フォルダ内の中のフォルダ達のフォルダ名を調べる。」

ことはできないでしょうか?さらに、フォルダが2つ3つ下層に入っていた場合はどうでしょうか?

よろしくご解答お願い致します。今回も最も参考になる方に200ポイントをお送り致します。

●質問者: zachouR
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Perl どうでしょう ファイル フォルダ ポイント
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● b-wind
●20ポイント

ここまで来るとモジュールを使った方がいいでしょうね。

http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%...

http://www.drk7.jp/MT/archives/000960.html

File::Find は標準モジュールなので大抵の環境で使えるはずです。

◎質問者からの返答

なるほど、、、モジュールですね。

こんなモジュールがあるなんて知りませんでした。ありがとうございます!


2 ● ota2244
●20ポイント

再帰関数を使って取得することも出来ます。


&recursive(".", 0);


sub recursive

{

my( $sBaseDir ) = @_;

my( @FileLists, $sFileName );


@FileLists = glob( $sBaseDir.'/*' );


foreach $sFileName ( @FileLists ){

if ( -d $sFileName ){

print "$sFileName";

&recursive( $sFileName );

}

}

}

◎質問者からの返答

ソースも短くていい感じですね。

ありがとうございます!


3 ● postgres
●20ポイント

階層に対応するためには、ファイル名を調べる処理を関数化することで対応できます。

呼び出し例

findFile("./forlder/");

sub findFile{

local($dir) = @_;

local(*DIR, $file);

if(!opendir(DIR, $dir)){

return;

}

while($file = readdir(DIR)){

if(($file eq ".") || ($file eq "..")){

# "."や".."は無視する

next;

}

if(-d "$dir/$file"){

# フォルダの場合は再起処理

findFile("$dir/$file");

}

else{

($ext = $file) =~ s/^.+\.([^\.]+)$/$1/;

print "$file : $ext\n";

}

}

closedir(DIR);

}

◎質問者からの返答

これも、すぐに利用できそうです。

ありがとうございます!

さっそく組み込んでみます!


4 ● fonya3
●20ポイント

指定したディレクトリ以下を再帰的に見ていくサンプルです。

サブルーチンにして再帰的に呼び出すところがポイントです。

変数の有効範囲にご注意ください。

#!/bin/perl

#階層の深さ
$depth=2;
#対象ディレクトリ \はエスケープして \\と書くこと(Windowsの場合)
$rootdir="/var";

#サブルーチンの呼び出し
&dirlist($rootdir);

sub dirlist {

#引数を配列に入れる
(my $dir) = @_;
my $currentdir = $dir;

#ディレクトリを開く
if( -r $dir ){
opendir(DIR, $dir) or die "Can not open $dir";
}

#ディレクトリ内の一覧を読み込み配列に代入
my @file = readdir(DIR);

#ディレクトリを閉じる
closedir(DIR);

#配列をなめる
foreach (@file) {

my $current= "$currentdir/$_";

if( -d $current && !( $_ =~ /^\.$/ ) && !( $_ =~ /^\.\.$/ ) ){

#ディレクトリの場合は再帰的にその中を見に行く
print "[DIR] $current\n";
&dirlist($current);

}elsif( -f $current ){

#ファイルの場合はファイ名を出力
print "[FILE] $current\n";

}
}
}
◎質問者からの返答

これは、とても詳しく調べられそうで、とても簡単に組み込めそうです!

ありがとうございます!


5 ● znz
●20ポイント

調べたい階層の深さが固定なら http://q.hatena.ne.jp/1156387704#a593648 と同じようにglobを使って、globの末尾に/をつけると良いのではないでしょうか。

perl -le 'print join " ", <*/>'

perl -le 'print join " ", <*/*/>'

perl -le 'print join " ", <*/*/*/>'

再帰的に調べたい場合はPerlのglobだと無理そうです。(zshなどでは**/で出来るのですが。)

◎質問者からの返答

階層は固定ではないんです、、、(;;)ノ

でも、参考になりました。

ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ