문제

많은 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top