如何在 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 版本?
如何在Ubuntu 14.04 LTS上安装Snap应用程序
php 脚本在 Ubuntu 14.04 服务器上运行,phpmyadmin 没有