Назад | Перейти на главную страницу

Как распаковать отдельный файл из архива со случайно сгенерированными именами каталогов?

Я пытаюсь написать сценарий, который загрузит тарбол из github и извлеките из него один файл.

Однако в каталоге верхнего уровня внутри tarball есть несколько случайных символов, которые, как мне кажется, меняются при обновлении репо / 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]

Любые идеи?

Может какой-нибудь 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

Нашел ответ, оказалось так просто, на помощь приходит 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