如何在 ubuntu 14.04 上运行的 ruby​​ 中以编程方式解压缩 .tar.xz 文件(没有中间体)?

Posted

技术标签:

【中文标题】如何在 ubuntu 14.04 上运行的 ruby​​ 中以编程方式解压缩 .tar.xz 文件(没有中间体)?【英文标题】:How to programmatically decompress .tar.xz file (without intermediates) in ruby running on ubuntu 14.04? 【发布时间】:2016-12-02 00:45:02 【问题描述】:

所以...

我正在编写一个 ruby​​ 脚本来初始化生产主机以运行应用程序(创建用户组、用户、SSH 密钥等),但我一直在安装 NPM / Node。我不想使用包管理器来安装它,而是简单地获取我想要的版本(在本例中为 6.9.1)的 .tar.xz 文件并将其解压到我想要添加的二进制文件的位置走向我的道路。目前,我们将从Node downloads...

我找到了this SO 答案,我正在使用它来尝试让我的脚本正常工作。看起来 Ruby 没有开箱即用的方式来处理“.xz”文件,但我的 Ubuntu 发行版确实有更高版本的 tar,因此它可以处理“tar -xJf ...”。我正在考虑做一些类似的事情......

require 'fileutils'
require 'open-uri'

uri = "https://nodejs.org/dist/v6.9.1/node-v6.9.1-linux-x64.tar.xz"
source = open(uri)
data = system("cat", IO.binread(source), "|", "tar", "-xJf", "-")
# put data where I want using FileUtils

...我绝对可以使用中间文件和更多系统命令(或者甚至只是一个 curl 调用,但我尽量不使用系统调用)。我看到有一些我可以使用的 Gem,例如 this,但我不想包含任何依赖项。关于实现优雅解决方案的任何想法?

【问题讨论】:

【参考方案1】:

system 太弱了。为此,您需要IO::popen

IO.popen(['tar', '-xJC', target_dir, '-f', '-'], 'wb') do |io|
  io.write(IO.binread(source))
end

popen 将打开一个子进程,并将io 连接到它的标准输入/标准输出。不需要 FileUtils,-C 选项告诉tar 把东西放在哪里。

【讨论】:

完美运行,谢谢!请注意,我还稍微修改了它(...“-”、“--strip-components”、“1”]...),以便将内容直接压缩到我想要的文件夹中。

以上是关于如何在 ubuntu 14.04 上运行的 ruby​​ 中以编程方式解压缩 .tar.xz 文件(没有中间体)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ubuntu 14.04 上更改 php-cli 版本?

Eclipse 未在 Ubuntu 14.04 上运行

如何在Ubuntu 14.04 LTS上安装Snap应用程序

php 脚本在 Ubuntu 14.04 服务器上运行,phpmyadmin 没有

无法在 ARMv7 处理器 Ubuntu 14.04 上运行 mksdcard sdk 工具

在Ubuntu 14.04上设置生产环境可用的Node.js