2009-09-02 8 views
2

多くのサブフォルダを含むClientというフォルダがあります。私はPerlスクリプトを作成して、それらのサブフォルダのそれぞれを見てそこにあるフォルダを調べたいと思っています。それがあれば、私はそれをスキップして移動したい、そこになければ、私はそれを作成し、いくつかの処理をしたい。Perlでサブ・サブディレクトリを確認するにはどうすればよいですか?

すべてのサブフォルダをループして、必要なディレクトリを確認するにはどうすればよいですか?私は、フォルダやサブフォルダ内のすべてのファイルを取得する方法に関する多くの情報を見つけましたが、各サブフォルダ内のディレクトリを調べることについては何も見つかりませんでした。

答えて

12

Augh!他の答えには多すぎる複雑さ。元の質問は、再帰的なトラバーサルを求めているようには見えません。私の知る限り見ることができるように、これは完全に賢明な解決策、およびブートに非常に読みやすく:

foreach my $dir (glob "Client/*") { 
    next if ! -d $dir;    # skip if it's not a directory 
    next if -d "$dir/subfolder"; # skip if subfolder already exists 
    mkdir "$dir/subfolder" or die; # create it 
    do_some_processing();   # do some processing 
} 

真剣に人々:opendir関数/ readdirは?本当に?

+0

人々はモジュールウィルスを手に入れ、プログラムを忘れる。少なくとも私はこれを見る唯一の人ではない。 :) –

+0

アーメン! +1 KISSソリューションの場合: – DVK

+0

しかし、私は "$!"を使用しないためにdownvoteに誘惑されます。 mkdirからのエラーメッセージ: – DVK

2
#!/usr/bin/perl 

use strict; 

use Fcntl qw(:DEFAULT :flock :seek); 
use File::Spec; 
use IO::Handle; 

my $startdir = shift @ARGV || '.'; 
die "$startdir is not a directory\n" 
    unless -d $startdir; 
my $verify_dir_name = 'MyDir'; 

my $dh = new IO::Handle; 
opendir $dh, $startdir or 
    die "Cannot open $startdir: $!\n"; 
while(defined(my $cont = readdir($dh))) { 
    next 
     if $cont eq '.' || $cont eq '..'; 
    my $fullpath = File::Spec->catfile($dir, $cont); 
    next 
     unless -d $fullpath && -r $fullpath && -w $fullpath; 
    my $verify_path = File::Spec->catfile($fullpath, $verify_dir_name); 
    next 
     if -d $verify_path; 
    mkdir($verify_path, 0755); 
    # do whatever other operations you want to $verify_path 
} 
closedir($dh); 
+1

誰かが 'IO :: Handle; use –

+0

を実際に忘れてしまった。今はまし。 :) – chaos

0

短い答えは、File :: FIndです。

長い答えはまずフォルダの存在を検証するサブルーチンを作成し、そこにフォルダがない場合は作成してから必要な処理を行います。次に、File :: Findモジュールのfindメソッドを呼び出し、サブルーチンとすべてのサブフォルダを処理する開始フォルダへの参照を呼び出します。

+0

これは、このような単純な作業のための多くの作業です。 :) –

4

ステップに分かればかなり簡単です。 globでサブディレクトリのリストを取得し、次にサブディレクトリのリストを取得します。 File :: Findのようなモジュールを使用している場合は、おそらくあまりにも多くの作業をしている可能性があります。

関連する問題