Je veux décompresser beaucoup de fichiers zip. Existe-t-il un module ou un script qui vérifie le format du fichier zip et le décompresse? Cela devrait fonctionner sous Linux, je m'en fous des autres systèmes d'exploitation.unzip (zip, tar, tag.gz) fichiers avec ruby
Répondre
Pour extraire des fichiers à partir d'un fichier tar.gz vous pouvez utiliser les méthodes suivantes de paquets distribués avec 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
Chaque entrée de type Gem::Package::TarReader::Entry pointe vers un fichier ou un répertoire dans le .tar.gz fichier.
Un code similaire peut être utilisé (remplacer Lecteur avec enregistreur) pour écrire des fichiers dans un fichier .tar.gz.
La façon la plus simple est d'utiliser probablement Zlib
Zlib est une bibliothèque Ruby. Ce qui suit est un programme simple pour récupérer un fichier compressé d'une URL particulière, le décompresser et coller son contenu à l'écran.
require 'zlib'
require 'open-uri'
uri = "www.somedomain.com/filename.gz"
source = open(uri)
gz = Zlib::GzipReader.new(source)
result = gz.read
puts result
J'espère que cela aide.
Bien que Florian's answer ait raison, il ne prend pas en compte tar LongLinks (Essayez d'extraire jdk-7u40-linux-i586.tar.gz d'oracle: P). Le code suivant devrait être en mesure de le faire:
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
est ': verbose = > false' nécessaire? –
Non, je ne voulais rien imprimer dans mon cas d'utilisation. –
Draco, thx pour vous snippet. Certains TARs codent les répertoires comme des chemins se terminant par '/' - voir this Wiki. Le tar examiné est Oracle Server JRE 7u80 for Windows. Cela fonctionne pour eux:
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
- 1. Flex AIR unzip
- 2. Extraire des fichiers du fichier ZIP avec VBScript
- 3. Ruby: Créer une archive Tar gzippée
- 4. Lire les commentaires des fichiers d'un fichier zip dans Ruby
- 5. Comment grouper (zip/tar /?) Des ensembles de fichiers pour qu'une application iPhone puisse les développer?
- 6. Télécharger des fichiers ZIP avec CodeIgniter?
- 7. C# Lecture de fichiers 'Zip' avec FileStream
- 8. Fichier écrasé avec tar
- 9. création de fichier zip multiplate-forme
- 10. Comment puis-je compresser des fichiers zip/tar sur S3 sans les copier d'abord sur le serveur?
- 11. Comment créer des fichiers ZIP avec un codage spécifique
- 12. Comment conserver le bit setuid dans les archives tar avec Perl's Archive :: Tar?
- 13. Les fichiers ZIP sont corrompus par IE
- 14. tar (sur Windows) une liste de fichiers dans C#
- 15. Impossible de télécharger des fichiers zip occasionnellement
- 16. Windows API pour extraire les fichiers zip?
- 17. Récupérer des fichiers zip ou gzip corrompus?
- 18. Comment utiliser System.IO.Compression pour lire/écrire des fichiers ZIP?
- 19. Ruby accessible Gestionnaire de fichiers
- 20. SharpZipLib ~ Comment extraire des fichiers spécifiques d'un zip
- 21. Inclure les fichiers dans une ligne de commande avec Ruby
- 22. PHP Zip extractTo - problème avec les autorisations
- 23. Recherche rapide de codes zip avec jQuery
- 24. Est-il possible d'utiliser la bibliothèque PhysFS avec des fichiers zip cryptés?
- 25. Lecture d'un fichier zip à partir d'une requête GET sans enregistrement préalable dans Ruby?
- 26. Comment faire pour que le mode Zip-Archive d'emacs fonctionne sous Windows
- 27. Extrait répertoire à l'intérieur Zip
- 28. détecter des fichiers binaires et des codages de caractères dans les fichiers zip
- 29. Comment puis-je ouvrir un fichier avec une extension non-zip en tant que fichier zip dans emacs?
- 30. Actionscript 3: Solution pour lire les archives TAR?
Mavryx: Quand je suis en train de votre extrait Je reçois l'erreur suivante: unzip.rb: 5: Variable locale non définie ou méthode 'uri » pour # (NameError) –
maetthew
@maetthew vérifier la ligne 4 et assurez-vous que vous utilisez la même variable (uri ici) dans les deux lignes – BurmajaM