【问题标题】:How can I archive a directory in Perl like tar does in UNIX?如何像 tar 在 UNIX 中一样在 Perl 中归档目录?
【发布时间】:2010-10-05 15:48:48
【问题描述】:

我想归档一个目录(我不知道我是否可以调用“我想 tar 一个目录”)。我想在解压缩时保留另一端的访问权限。我应该在 perl 中解决这个问题。

感谢您的回复,但为什么我要求这样做 Perl 是我希望它独立于平台。我想将一个大文件传输到多台机器上。这些机器可以是任何平台。我应该能够正确解压这个 tar 文件,对吗?所以我想编写自己的 tar 和 untar 程序。为什么我使用 Perl 是为了让它独立于平台。所以我不能通过在脚本和类似的东西中打开 shell 来使用 tar 命令。 Archive::Tar 模块只处理 tarred 文件,但它没有归档文件的选项。

【问题讨论】:

  • 焦油有什么问题?请说明您不能或不会为此使用 tar 的原因。
  • 是的,“to tar a directory”是一个常用短语。
  • 我不明白您对 Archive::Tar 的问题。您可以像这样创建档案: Archive::Tar->create_archive( 'out.tgz', COMPRESSION_GZIP, @filelist);拉链呢?它在 linux、windows 和 mac 上。
  • 您需要安装 IO::Zlib(跨平台,5.10.0 中的核心)才能使用 GZIP 压缩。或者,您可以使用 Archive::Zip(在 5.10.0 中也是跨平台和核心)创建 zip 存档。 Perl 中的 tar 包含在 Archive::Tar 中。它被称为 ptar。

标签: perl tar


【解决方案1】:

这是一个简单的例子:

#!/usr/bin/perl -w

use strict;
use warnings 'all';
use Archive::Tar;

# Create a new tar object:
my $tar = Archive::Tar->new();

# Add some files:
$tar->add_files( </path/to/files/*.html> );
# */ fix syntax highlighing in stackoverflow.com

# Finished:
$tar->write( 'file.tar' );

# Now extract:
my $tar = Archive::Tar->new();
$tar->read( 'file.tar' );
$tar->extract();

【讨论】:

    【解决方案2】:

    您可能想查看 CPAN 上的 Archive::Tar。 (我只是猜测,我自己从来没有使用过。)你为什么坚持在 Perl 中做呢?

    【讨论】:

    • 归档 tar 可用于 ActivePerl。
    【解决方案3】:

    两个参数;压缩的 tar 文件的名称和 tar 文件中所需的目录名称。 例如

    tarcvf test.tar.gz mydir
    #!/usr/bin/perl -w 
    
    use strict;
    use warnings 'all';
    use Archive::Tar;
    use File::Find;
    
    
    my $archive=$ARGV[0];
    my $dir=$ARGV[1];
    
    if ($#ARGV != 1) {
        print "usage: tarcvf test.tar.gz directory\n";
        exit;
    }
    
    # Create inventory of files & directories
    my @inventory = ();
    find (sub { push @inventory, $File::Find::name }, $dir);
    
    # Create a new tar object
    my $tar = Archive::Tar->new();
    
    $tar->add_files( @inventory );
    
    # Write compressed tar file
    $tar->write( $archive, 9 );
    

    【讨论】:

    • 这个答案值得更多投票,因为它正确回答了如何将目录及其内容打包。
    【解决方案4】:

    您可以使用 Archive::Tar Perl 模块,也可以直接执行 tar。

    如果您在命令行中使用 tar 选项运行,请使用 -p 标志来保留权限。

    如果您只是想压缩目录,我会直接运行命令,您不需要使用 Perl。如果你之后需要做一些花哨的处理,也许你应该这样做。视情况而定。

    【讨论】:

      【解决方案5】:

      在我看来,rsync 可能是一个更好的解决方案,但你没有说太多你有什么其他限制。

      【讨论】:

        猜你喜欢
        • 2012-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 2021-10-02
        • 1970-01-01
        相关资源
        最近更新 更多