2012-06-14 106 views
0

我想編寫一個遍歷目錄及其子目錄的腳本,抓取所有XML文件並解析它們。我遇到chdir問題。這工作得很好:如何使用chdir遍歷子目錄並解析XML文件?

my $search = "/home/user/books"; 
chdir($search) or die "cant change dir to $search $!"; 
system("ls"); 

但我希望用戶來決定,他要尋找它的路徑,所以我用Getopt::Long

use strict; 
use warnings; 
use Data::Dumper; 
use XML::Simple; 
use Getopt::Long; 

my $outputFile = ''; 
my $searchPath = ""; 
my $debug  = 0; 
GetOptions('outputFile=s' => \$outputFile, 'searchPath=s' => \$searchPath); 
if ($outputFile eq '' or $searchPath = '') { 
    die("parameter --outpulFile=s is required."); 
} 
$searchPath =~ s/\/*$/\//; 
my @founddirs = `cd $searchPath`; 
foreach my $foundfiles (@founddirs) { 
    print $foundfiles; 
    chdir($foundfiles) or die "cant change dir to $searchPath $!"; 
    chdir('..'); 
} 

命令來運行:

perl sample.pl --outputFile=books.txt --searchPath=/home/user/june18 

我想抓取子目錄中的所有recursive.xml文件並解析它們。有誰知道這可以做到嗎?

+0

爲什麼沒有你的代碼的工作?你是否收到錯誤信息? –

+0

是的它說不能執行「cd」:沒有這樣的文件或目錄在sample.pl第20行。 – upstream

+0

我剛剛嘗試添加我的@founddirs ='cd $ searchPath; ls';現在它說「不能改變目錄到/沒有這樣的文件或目錄」 – upstream

回答

1

幾個問題在這裏:

  • $searchPath = ''在輸入驗證過程中設置爲空字符串的搜索路徑。改爲使用eq(不是==
  • @founddirs將不包含任何內容,因爲反引號操作符將不返回任何內容。這是因爲

    my @founddirs = `cd $searchPath`; 
    

    不會打印被換行符分隔的發現目錄。也許你以後ls $searchPath

在一個側面說明,爲什麼不使用File::Find反而是?

use strict; 
use warnings; 

use File::Find; 
use Getopt::Long; 

my $outputFile; 
my $searchPath; 

GetOptions(
      'outputFile=s' => \$outputFile, 
      'searchPath=s' => \$searchPath, 
     ); 

die "Usage : perl sample.pl -outputFile -searchPath\n" 
    unless $outputFile && $searchPath; 

die "No such directory found: $searchPath\n" unless -d $searchPath; 

find(sub { print "$File::Find::name\n" if /$outputFile/ }, $searchPath); 
+0

是的我試着用ls,但它一直在打印根目錄的文件夾。所以我怎麼能仍然保持searchPath參數通過用戶輸入並使用file :: Find? 我是新來的perl。 – upstream

+0

@upstream:提供的示例代碼(儘管未經測試) – Zaid

+0

嘗試了示例代碼,但沒有得到任何結果? – upstream

1
#!/usr/bin/perl -- 
use strict; use warnings; 
use Data::Dump qw/ dd /; 
use File::Find::Rule qw/ find /; 
my @files = find(
    file => 
    name => '*.xml', 
    in => \@ARGV 
); 

dd \@files; 

__END__ 
$ perl ffrule 
[] 

$ perl ffrule ../soap 
[ 
"../soap/ex1.xml", 
"../soap/ex2.xml", 
"../soap/ex3.xml", 
]