Ruby가있는 압축 (zip, tar, tag.gz) 파일
문제
많은 zip 파일을 압축하고 싶습니다. zip 파일의 형식을 확인하고 압축을 억제하는 모듈이나 스크립트가 있습니까? 이것은 Linux에서 작동해야합니다. 나는 다른 OSS에 대해 신경 쓰지 않습니다.
해결책
.tar.gz 파일에서 파일을 추출하려면 Ruby로 배포 된 패키지에서 다음 방법을 사용할 수 있습니다.
require 'rubygems/package'
require 'zlib'
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open('Path/To/myfile.tar.gz'))
tar_extract.rewind # The extract has to be rewinded after every iteration
tar_extract.each do |entry|
puts entry.full_name
puts entry.directory?
puts entry.file?
# puts entry.read
end
tar_extract.close
유형의 각 항목 gem :: package :: tarreader :: Entry .tar.gz 파일 내의 파일 또는 디렉토리를 가리 킵니다.
비슷한 코드를 사용하여 (리더로 교체) .tar.gz 파일에 파일을 작성할 수 있습니다.
다른 팁
가장 쉬운 방법은 아마도 Zlib을 사용하는 것입니다
Zlib은 루비 도서관입니다. 다음은 특정 URL에서 ZIPPEN 파일을 잡고 압축을 풀고 내용물을 화면에 붙여 넣는 간단한 프로그램입니다.
require 'zlib'
require 'open-uri'
uri = "www.somedomain.com/filename.gz"
source = open(uri)
gz = Zlib::GzipReader.new(source)
result = gz.read
puts result
이게 도움이 되길 바란다.
하지만 플로리안의 대답 맞습니다. 고려하지 않습니다 타르 롱 링크 (추출을 시도하십시오 JDK-7U40-LINUX-I586.TAR.GZ 오라클에서 : p). 다음 코드는 다음을 수행 할 수 있어야합니다.
require 'rubygems/package'
require 'zlib'
TAR_LONGLINK = '././@LongLink'
tar_gz_archive = '/path/to/archive.tar.gz'
destination = '/where/extract/to'
Gem::Package::TarReader.new( Zlib::GzipReader.open tar_gz_archive ) do |tar|
dest = nil
tar.each do |entry|
if entry.full_name == TAR_LONGLINK
dest = File.join destination, entry.read.strip
next
end
dest ||= File.join destination, entry.full_name
if entry.directory?
File.delete dest if File.file? dest
FileUtils.mkdir_p dest, :mode => entry.header.mode, :verbose => false
elsif entry.file?
FileUtils.rm_rf dest if File.directory? dest
File.open dest, "wb" do |f|
f.print entry.read
end
FileUtils.chmod entry.header.mode, dest, :verbose => false
elsif entry.header.typeflag == '2' #Symlink!
File.symlink entry.header.linkname, dest
end
dest = nil
end
end
드라코, 당신을위한 thx 단편. 일부 타르는 디렉토리를 '/'로 끝나는 경로로 디렉토리를 인코딩합니다. 이것 위키. Examlple Tar입니다 Windows 용 Oracle Server JRE 7U80. 이것은 그들에게 효과가 있습니다 :
require 'fileutils'
require 'rubygems/package'
require 'zlib'
TAR_LONGLINK = '././@LongLink'
Gem::Package::TarReader.new( Zlib::GzipReader.open tar_gz_archive ) do |tar|
dest = nil
tar.each do |entry|
if entry.full_name == TAR_LONGLINK
dest = File.join destination, entry.read.strip
next
end
dest ||= File.join destination, entry.full_name
if entry.directory? || (entry.header.typeflag == '' && entry.full_name.end_with?('/'))
File.delete dest if File.file? dest
FileUtils.mkdir_p dest, :mode => entry.header.mode, :verbose => false
elsif entry.file? || (entry.header.typeflag == '' && !entry.full_name.end_with?('/'))
FileUtils.rm_rf dest if File.directory? dest
File.open dest, "wb" do |f|
f.print entry.read
end
FileUtils.chmod entry.header.mode, dest, :verbose => false
elsif entry.header.typeflag == '2' #Symlink!
File.symlink entry.header.linkname, dest
else
puts "Unkown tar entry: #{entry.full_name} type: #{entry.header.typeflag}."
end
dest = nil
end
end
end
제휴하지 않습니다 StackOverflow