2011-05-19 22 views
10

.tgz dosyalarını ayıklamak için aşağıdaki kodu kullanıyorum. Ayıklamak için gereken günlük dosyalarının (.tgz), diğer .tgz dosyaları ve bunların içinde .tar dosyaları bulunan alt dizinleri vardır. Bunları da çıkarmak istiyorum.Bir .tgz dosyası ayıklamak ve .tgz ve .tar olan tüm alt dizinleri ayıklamak istiyorum.

Sonuç olarak, .tgz dosyasında görüntülenen tüm .log dosyaları ve .txt dosyalarında belirli dizeleri aramaya çalışıyorum.

.tgz dosyasını ayıklamak için kullanıyorum kod aşağıdadır. Alt dosyaları (.tgz ve .tar) ayıklamak için çalışıyorum. Şimdiye kadar, başarısız oldum.

import os, sys, tarfile 

try: 
    tar = tarfile.open(sys.argv[1] + '.tgz', 'r:gz') 
    for item in tar: 
     tar.extract(item) 
    print 'Done.' 
except: 
    name = os.path.basename(sys.argv[0]) 
    print name[:name.rfind('.')], '<filename>' 
+5

Bu, bir özyineleme için harika bir Kullanım Durumu gibi görünüyor. Işlev için ilk tarfile sağlar ve başka bir tar dosya ile karşılaşırsa, işlev kendisini yeni tar dosyasıyla çağırır. Bir günlük dosyası bulursanız, günlük dosyalarını işleyen başka bir işlevi çalıştırabilirsiniz. – Jacob

cevap

11

Bu, istenilen sonucu vermelidir: @cularis bu özyineleme denir söylediği gibi

import os, sys, tarfile 

def extract(tar_url, extract_path='.'): 
    print tar_url 
    tar = tarfile.open(tar_url, 'r') 
    for item in tar: 
     tar.extract(item, extract_path) 
     if item.name.find(".tgz") != -1 or item.name.find(".tar") != -1: 
      extract(item.name, "./" + item.name[:item.name.rfind('/')]) 
try: 

    extract(sys.argv[1] + '.tgz') 
    print 'Done.' 
except: 
    name = os.path.basename(sys.argv[0]) 
    print name[:name.rfind('.')], '<filename>' 

.

+0

Kod, .tgz dosyasını açar ve bir klasörü çıkarır - 'storage', ve bu klasörde iki tane daha klasör var = 'Folder1' & 'Folder'2, her ikisi de .tgz dosyalarına ve .tar dosyalarına sahip değil. ekstre edildi. Yukarıdaki kod sadece ana .tgz dosyasını açmaktadır, ancak alt klasörlerdeki dosyaları değil. – suffa

+1

Üzgünüz, katran dosyalarını unutmuşum. Kod güncellendi. Yine de alt klasörlerde .tgz unzippping oldu. Artık arşivde yuvalanmış .tar ve .tgz dosyaları için çalışıyor. – berni

+0

Aynı kodu cmd satırından ziyade betik olarak nasıl uygularım? Teşekkürler! – suffa

İlgili konular