Perl tar-файл создает каталог рекурсивно - PullRequest
2 голосов
/ 28 мая 2020

Я тарирую содержимое каталога с помощью модуля Archive::Tar.

Мои сценарии ниже:

#!/usr/bin/perl -w 

use strict;
use warnings;
use Archive::Tar;
use File::Find;
use Data::Dumper;

my $home_dir = "C:/Users/Documents/Vinod/Perl_Scripts/test/";

my $src_location = $home_dir."LOG_DIR";
my $dst_location = $home_dir."file.tar.gz";

my @inventory = ();
find (sub { push @inventory, $File::Find::name }, $src_location);

print "Files:".Dumper(\@inventory);

my $tar = Archive::Tar->new();

$tar->add_files( @inventory );

$tar->write( $dst_location , 9 );

Скрипт может создать файл file.tar.gz в местоположении C:/Users/Documents/Vinod/Perl_Scripts/test/.

Но когда я извлекаю file.tar.gz вручную, он снова рекурсивно создает весь путь. Таким образом, содержимое LOG_DIR будет видно в месте C:/Users/Documents/Vinod/Perl_Scripts/test/file.tar/file/Users/Documents/Vinod/Perl_Scripts/test/LOG_DIR/

Как я могу получить содержимое, которое находится внутри C:/Users/Documents/Vinod/Perl_Scripts/test/LOG_DIR/ в C:/Users/Documents/Vinod/Perl_Scripts/test/file.tar/file/ при его извлечении.

Ответы [ 2 ]

3 голосов
/ 28 мая 2020

Если вы не хотите воссоздавать полный путь, chdir в домашний каталог и сделайте исходный каталог относительным:

my $home_dir = "C:/Users/Documents/Vinod/Perl_Scripts/test/";

chdir $home_dir;
my $src_location = "LOG_DIR";
my $dst_location = $home_dir."file.tar.gz";
2 голосов
/ 29 мая 2020

Поскольку вы используете $File::Find::name для своего списка, вы получаете абсолютный путь к каждому файлу. Это имя, которое вы даете Archive::Tar, так что это имя, которое он использует. Вы можете увидеть файлы в архиве:

$ tar -tzf archive.tgz

Вместо этого существуют различные способы получения относительных путей. Вы можете сделать это в нужной функции. Удалите ту часть пути, которая вам не нужна. Обычно это не тот каталог, который вы использовали для find (src_location), потому что вы хотите сохранить этот уровень структуры:

my @inventory;
find(
    sub {
        return if /\A\.\.?\z/;
        push @inventory, abs2rel( $File::Find::name, $home_dir )
        }, $src_location
    );

Или сделайте это после:

@inventory = map { abs2rel($_, $home_dir) } @inventory;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...