Perlに関しての質問です。


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

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

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

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

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

回答の条件
  • 1人3回まで
  • 登録:2006/08/24 13:38:48
  • 終了:2006/08/31 13:40:03

回答(5件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/08/24 13:51:31

ポイント20pt

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

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 は標準モジュールなので大抵の環境で使えるはずです。

id:zachouR

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

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

2006/08/24 14:35:54
id:ota2244 No.2

ota2244回答回数77ベストアンサー獲得回数42006/08/24 15:21:20

ポイント20pt

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


&recursive(".", 0);


sub recursive

{

 my( $sBaseDir ) = @_;

 my( @FileLists, $sFileName );


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


 foreach $sFileName ( @FileLists ){

  if ( -d $sFileName ){

   print "$sFileName";

   &recursive( $sFileName );

  }

 }

}

id:zachouR

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

ありがとうございます!

2006/08/30 12:55:40
id:postgres No.3

postgres回答回数1ベストアンサー獲得回数02006/08/24 15:59:25

ポイント20pt

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

呼び出し例

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);

}

id:zachouR

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

ありがとうございます!

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

2006/08/30 12:56:36
id:fonya3 No.4

fonya3回答回数238ベストアンサー獲得回数102006/08/24 16:49:31

ポイント20pt

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

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

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

#!/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";

		}
	}
}
id:zachouR

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

ありがとうございます!

2006/08/30 12:59:22
id:znz No.5

znz回答回数193ベストアンサー獲得回数252006/08/25 02:34:32

ポイント20pt

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

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

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

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

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

id:zachouR

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

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

ありがとうございます。

2006/08/30 13:00:21

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません