我需要在许多文件上运行一些shell命令,有时我会回复多个文件。问题是:如何从Ruby中的IO.popen中读回几个文件?
例如,想象一下以下情况:
file = grid.get(record['_id']) # fetch a file from database
IO.popen('tar -Oxmz', 'ab') {|pipe| pipe.write(file.read)} # pass to tar and extract
这需要重新读取文件系统中提取的所有文件。我发现这是我脚本的速度瓶颈,我想知道我是否可以完成相同的任务。我尝试了以下方法:
file = grid.get(record['_id'])
IO.popen('tar -Oxmz', 'w+b') do |pipe|
pipe.write(file.read)
pipe.close_write
output = pipe.read
end
它有效,但我得到了整个响应,这里包括几个提取的文件,一个整体(变量output
)。我需要彼此分开的文件,可能还有他们的名字。有没有办法做到这一点?
顺便说一句,生成的文件大部分时间都是文本,但有时候是二进制文件。为每个输出文件运行管道不是一个解决方案,因为为每个文件运行命令的实际开销超过了在内存中进行转换的好处。
P.S。实际用例不仅仅依赖于tar。我使用的软件没有Ruby包装器。