2010-04-12 5 views
1

일부 보관 파일이있는 디렉토리를 읽고 하나씩 보관 파일을 압축 해제하고 있습니다.Perl의 다른 위치에 tar 파일 보관

모든 것이 잘 보이지만 파일은 하위 모듈을 실행하는 주 perl 코드 모듈이있는 폴더에서 압축되지 않은 상태가됩니다.

내가 지정한 폴더에 아카이브를 생성하고 싶습니다.

sub ExtractFile 
{ 

#Read the folder which was copied in the output path recursively and extract if any file is compressed 
my $dirpath = $_[0]; 

opendir(D, "$dirpath") || die "Can't open dir $dirpath: $!\n"; 
my @list = readdir(D); 
closedir(D); 


foreach my $f (@list) 
{ 
    print " \$f = $f"; 
    if(-f $dirpath."/$f") 
    { 
    #print " File in directory $dirpath \n ";#is \$f = $f\n"; 

    my($file_name, $file_dirname,$filetype)= fileparse($f,qr{\..*}); 

    #print " \nThe file extension is $filetype"; 
    #print " \nThe file name is is $file_name"; 


    # If compressed file then extract the file 
    if($filetype eq ".tar" or $filetype eq ".tzr.gz") 
    { 

    my $arch_file = $dirpath."/$f"; 
    print "\n file to be extracted is $arch_file"; 
    my $tar = Archive::Tar->new($arch_file); 
    #$tar->extract() or die ("Cannot extract file $arch_file"); 

    #mkdir($dirpath."/$file_name"); 
    $tar->extract_file($arch_file,$dirpath."/$file_name") or die ("Cannot extract file $arch_file"); 
    } 

    } 
    if(-d $dirpath."/$f") 
    { 
    if($f eq "." or $f eq "..") 
    { next; } 
    print " Directory\n";# is $f"; 
    ExtractFile($dirpath."/$f"); 
    } 

} 


} 

ExtractFile가 재귀 적으로 모든 아카이브 루프에 호출되는 방법

이 내 코드입니다. $tar->extract()을 사용할 때이 메서드를 호출하는 폴더에서 압축이 풀립니다. 아카이브에

해당 파일 : 나는 $tar->extract_file($arch_file,$dirpath."/$file_name")를 사용하는 경우

는 오류가 발생합니다 '/home/fsang/dante/workspace/output/s.tar을'/ 홈/fsang/단테/lib 디렉토리에 /Extraction.pm line 80

해당 경로와 입력 결과를 확인하는 데 도움이되도록 문제가 없습니다.

일부 사용상의 문제가 있습니다. $tar->extract_file()을 모르겠습니다.

이 문제를 해결해 주신 모든 분들께 감사드립니다.

감사합니다,

답변

0

Sakshi 오타?

$tar->extract_file($arch_file,$dirpath."/$file_name") 

아마 당신은 extract_file를 오해 한

$tar->extract_file($arch_file,$dirpath."/".$file_name) 
+0

아니요, 당신은 오타가있는 사람입니다. 귀하의 "고정"라인에 따옴표가 홀수로 표시됩니다. – cjm

+0

여전히 동일한 오류 메시지가 나타납니다. –

+0

감사합니다. @cjm - 줄 끝 부분에 인용 부호를 잊어 버렸습니다. – Axarydax

2

해야한다. 첫 x 째 매개 변수는 추출 할 아카이브 내의 파일 이름입니다. 아카이브 자체의 경로를 지나가고 있습니다. 당신은 이것을 new에게 넘겼습니다. 다시 전달할 필요가 없습니다. 오류 메시지에 설명되어 있듯이 s.tar에는 /home/fsang/dante/workspace/output/s.tar이라는 파일이 없으므로 extract_file은 실패합니다.

$tar->list_files을 사용하여 아카이브의 파일 목록을 가져올 수 있습니다.

더 간단한 해결책은 아카이브 압축을 풀 디렉토리를 임시로 chdir하는 것입니다. File::pushd은이를 쉽게 수행 할 수있는 방법을 제공합니다.

+0

첫 번째 매개 변수를 전달할 내용을 설명해 주시겠습니까 보관 파일 iestar의 이름도 전달 했는데도 여전히 나타납니다. /home/fsang/dante/workspace/output 파일이 포함되어 있지 않습니다. /s.tar 내가 더 잘 이해 이제 .. 안녕 당신의 도움 –

+0

의 extract_file 방법을 감사를 감사를 호출하기 전에 좀 컬렉션 속성에 추가해야 할, 그것은 어떤 컬렉션에있는 파일을 검색하는 것 같습니다 및 File :: pushd를 사용하여 해결책을 찾았습니다. 많은 감사합니다. –

0
$tarFile = "test.tar.gz"; 
$myTar = Archive::Tar->new($tarFile); 
foreach my $member ($myTar->list_files()) 
{ 
    my $res = $myTar->extract_file($member , 'C:/temp/'.$member); 
    print "Exract error!\n" unless ($res); 
} 
0

저는 스위스 군용 칼 싸움에 총을 맞았습니다. 여기에 * nix에서 스크립트 한 줄은 당신이 원하는 것을 그입니다 :

find /source/dir -name "*.tar" -exec tar -C /target/dir -xvzf '{}' \; -print 

이것에 대한 스크립트를 작성 할 필요가 있는가? 디버그 라인 이외의 다른 기능을 반드시 수행하지는 않습니다.

관련 문제