2016-11-28 3 views
0

.tarまたは.gzファイルを作成しようとします。しかし、私のようないくつかの問題があります:上記はまた私のフォルダ構造です:perlを使ってウィンドウに.tarまたは.gzファイルを作成する

  1. をそれは注意

    D:\test\jtax-issue11-16\title.xml 
    D:\test\jtax-issue11-16\artwork 
    D:\test\jtax-issue11-16\artwork\cover.png 
    

完全なパスを取ります。

しかし、私の要件は次のとおりです。現在のフォルダ名のみ

私のコードでの.tarまたは.gzのファイルを作成する意味

jtax-issue11-16\title.xml 
jtax-issue11-16\artwork 
jtax-issue11-16\artwork\cover.png 

は次のとおりです。

use strict; 
use warnings; 
use Archive::Tar; 
use File::Find; 
use File::Basename 'basename'; 
use Cwd; 

my $current_path = getcwd; 
my @inventory =(); 
find (sub { push @inventory, $File::Find::name }, $current_path); 
my $tar = Archive::Tar->new(); 
$tar->add_files(@inventory); 
$tar->write('a.tar'); 

私はベース名を使用している場合、エラーが発生します。私はbasenameの使い方や現在のフォルダ名を持つ.tarまたは.gzファイルの作成方法を理解していません。

+0

あなたは現在のフォルダ&ファイル名 'jtax-issue11-16をフェッチすることができ、\' Dからtitle.xml':\テスト\のjtax-issue11-16 \ title.xml'using '正規表現' – AbhiNickz

答えて

0

find()に電話をしたときの$current_pathの場合、.find()に渡すだけです。そうすれば、$File::Find::nameにあるすべてのパスは現在のディレクトリからの相対パスになります。

.\jtax-issue11-16\title.xml 
.\jtax-issue11-16\artwork 
.\jtax-issue11-16\artwork\cover.png 

しかし、それはあなたにとって重要な場合は、そのパスの先頭から.\を削除するs/^\.\\//を使用することができます。あなたのようなパスを与える

my $current_path = getcwd; 
my @inventory =(); 
find (sub { push @inventory, $File::Find::name }, '.'); 

。最も簡単なことは、@inventoryを作成した後である可能性があります。

@inventory = map { s/^\.\\//; $_ } @inventory; 
+0

申し訳ありませんが、2つのフォルダを作成します.1つは.tarファイルです。もう一つは "jtax-issue11-16"です。 –

1
use File::Find::Rule qw(); 

my $base_dir = '.'; 

my @files = 
    map { s{^\Q$base_dir/}{}r } 
    File::Find::Rule 
    ->mindepth(1) 
    ->in($base_dir); 

または

use File::Find qw(find); 

my $base_dir = '.'; 

my @files; 
find(
    { 
     wanted => sub { push @files, s{^\Q$base_dir/}{}r }, 
     no_chdir => 1, 
    }, 
    $base_dir 
); 
shift(@files); 
0

私は自分のファイルにデイブクロスコードを追加して、私のO/Pを取得します。 コードは以下の通りです: -

use strict; 
use warnings; 
use Archive::Tar; 
use File::Find; 
use File::Basename 'basename'; 
use 5.010; 
use Cwd; 

my $current_dir = getcwd; 
my @tar_files; 
my @inventory =(); 
find (sub { push @inventory, $File::Find::name }, $current_dir); 
my $tar = Archive::Tar->new(); 
@inventory = map { s/^$current_dir\///; $_ } @inventory; 
foreach my $temp (@inventory) 
    { 
     # skip my file name which is conv.pl 
     # and skip blank entry in tar, which is created by $current_dir 
     if ($temp =~ m/conv\.pl/ || $temp =~ m/conv\.exe/ ||$temp =~/$current_dir/) 
     { 
     } 
     else 
     { 
      push (@tar_files , $temp); 
     } 
    } 
$tar->add_files(@tar_files); 
$tar->write($file_name.".tar"); 
関連する問題