如何使用随机生成的目录名从档案中解压单个文件?

如何使用随机生成的目录名从档案中解压单个文件?

我正在尝试编写一个脚本来下载 tarball来自 github并从中提取单个文件。

但是 tarball 中的顶层目录中有一些随机字符,我认为在 repo/tarball 更新时这些字符会发生变化,这使得很难可靠地指定我想要提取的文件的路径。

这有效:

wget https://github.com/paulp/sbt-extras/tarball/master
tar --strip-components=1 -xf 'paulp-sbt-extras-d6c7222.tar.gz' 'paulp-sbt-extras-d6c7222/sbt'

但我想要这样的东西:

wget https://github.com/paulp/sbt-extras/tarball/master -O sbt-extras.tar.gz
tar --strip-components=1 -xf 'sbt-extras.tar.gz' '[generic tld placeholder]/sbt'

基本上,我想用一些通用的东西替换所有随机生成的字符,这样我就不必在随机字符发生变化时编辑脚本。

我考虑过将 tar 输出写入标准输出,然后通过管道传输到可以仅抓取 sbt 文件并丢弃其余内容的某个东西,但不确定要使用什么工具来实现这一点:

wget https://github.com/paulp/sbt-extras/tarball/master -O sbt-extras.tar.gz
tar --strip-components=1 -xf 'sbt-extras.tar.gz' -O - | [grab the sbt file, write it, and discard everything else]

有任何想法吗?

答案1

找到了答案,很简单,grep 来救援:

wget https://github.com/paulp/sbt-extras/tarball/master -O sbt-extras.tar.gz
tar --strip-components=1 -xf 'sbt-extras.tar.gz' -O | grep sbt > sbt

答案2

也许是一些 Perl?

use Archive::Tar;

$targetfile = 'sbt';

my $tar = Archive::Tar->new;
$tar->read('sbt-extras.tar.gz');

my @items = $tar->get_files;
for $item (@items) {
  if ($item->name eq "$targetfile") {
    $item->extract;
  }
}

未经测试,但请查看:

http://perldoc.perl.org/Archive/Tar.html

http://perldoc.perl.org/Archive/Tar/File.html

相关内容