2011-05-19 15 views
10

Sto usando il codice seguente per estrarre .tgz file. Il tipo di file di log (.tgz) che ho bisogno di estrarre avere sub-directory che hanno altri .tgz file e .tar file al loro interno. Voglio estrarre anche quelli.Voglio estrarre un file .tgz ed estrarre tutte le sottodirectory che hanno i file che sono .tgz e .tar

In definitiva, sto cercando di cercare determinate stringhe in tutti i file .log e nei file .txt che possono apparire in un file .tgz.

Di seguito è il codice che sto usando per estrarre il file .tgz. Ho cercato di capire come estrarre i file secondari (.tgz e .tar). Finora, non ho avuto successo.

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

Questo sembra essere un ottimo caso d'uso per una ricorsione. Fornisci il primo tarfile alla funzione e se incontra un altro file tar, la funzione è chiamata stessa con il nuovo file tar. Se si trova un file di registro, è possibile richiamare un'altra funzione che gestisce i file di registro. – Jacob

risposta

11

Questo dovrebbe dare il risultato desiderato:

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>' 

Come @cularis detto questo è chiamato ricorsione.

+0

Il codice decomprime il file .tgz e Dislays una cartella - 'stoccaggio', e in quella cartella ci sono due altre cartelle = 'Folder1' & 'Folder'2, entrambi che hanno i file .tgz e file .tar che non sono stati estratta. Il codice sopra è solo decomprimere il file .tgz principale, ma non i file nelle sottocartelle. – suffa

+1

Mi dispiace, ho dimenticato i file tar. Codice aggiornato Tuttavia è stato decompresso .tgz in sottocartelle. Ora funziona sia per i file .tar che .tgz nidificati nell'archivio. – berni

+0

come eseguirò lo stesso codice di uno script anziché dalla linea cmd? Grazie! – suffa

Problemi correlati