2011-05-19 7 views
10

Korzystam z poniższego kodu, aby wyodrębnić pliki .tgz. Typ plików dziennika (.tgz), które muszę wyodrębnić, mają podkatalogi, w których znajdują się inne pliki .tgz i pliki . Też chcę je wydobyć.Chcę wyodrębnić plik .tgz i wyodrębnić wszystkie podkatalogi, które mają pliki .tgz i .tar

Ostatecznie próbuję wyszukać określone ciągi we wszystkich plikach .log i .txt, które mogą pojawić się w pliku .tgz. Jest to kod, którego używam do wyodrębnienia pliku .tgz. Próbowałem dowiedzieć się, jak wyodrębnić pliki podrzędne (.tgz i .tar). Do tej pory nie udało mi się.

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

Wydaje się to być doskonałym przypadkiem użycia dla rekursji. Podajesz pierwszy plik tar do funkcji i jeśli napotka inny plik tar, funkcja wywołuje się z nowym plikiem tar. Jeśli znajdziesz plik dziennika, możesz wywołać inną funkcję, która obsługuje pliki logów. – Jacob

Odpowiedz

11

To powinno dać pożądanego rezultatu:

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

Jak @cularis powiedział nazywa się rekurencji.

+0

Kod rozpakowuje plik .tgz i wyświetla folder - "magazyn", aw tym folderze znajdują się dwa inne foldery = "Folder1" i "Folder" 2, oba z plikami .tgz i plikami .tar, które nie zostały jeszcze wytłoczony. Powyższy kod tylko rozpakowuje główny plik .tgz, ale nie pliki w podfolderach. – suffa

+1

Przepraszam, zapomniałem o plikach tar. Zaktualizowano kod. Niemniej jednak w podfolderach został rozpakowany .tgz. Teraz działa zarówno dla plików .tar, jak i .tgz zagnieżdżonych w archiwum. – berni

+0

w jaki sposób wykonać ten sam kod jako skrypt zamiast z wiersza cmd? Dzięki! – suffa

Powiązane problemy