2011-05-19 11 views
10

私は.tgzファイルを抽出するために以下のコードを使用しています。私が抽出する必要のあるログファイルのタイプ(.tgz)には、他の.tgzファイルと.tarファイルがあるサブディレクトリがあります。私もそれらを抽出したい。.tgzファイルを抽出し、.tgzと.tarファイルを含むサブディレクトリを抽出したい

最終的には、すべての.logファイルと.txtファイルの特定の文字列を、.tgzファイル内に表示されるように検索しようとしています。

以下は、.tgzファイルの抽出に使用しているコードです。私はどのようにサブファイル(.tgz.tar)を抽出するのかを試してみました。これまでのところ、私はうまくいっていません。

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

これは再帰に最適なユースケースです。最初のtarファイルを関数に提供し、別のtarファイルを検出した場合、その関数は新しいtarファイルで自身を呼び出します。ログファイルを見つけたら、ログファイルを扱う別の関数を呼び出すことができます。 – Jacob

答えて

11

これはあなたの望ましい結果を与える必要があります:@cularisはこれが再帰と呼ばれて言ったように

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

コードは.tgzファイルを解凍し、フォルダ 'storage'を削除します。そのフォルダには、.tgzファイルと.tarファイルが存在しない2つの他のフォルダ= 'Folder1'& 'Folder'2があります抽出された。上記のコードはメインの.tgzファイルを解凍するだけですが、サブフォルダにはファイルを解凍しません。 – suffa

+1

申し訳ありません、私はtarファイルについて忘れました。コードが更新されました。それにもかかわらず、サブフォルダで.zipファイルを解凍していました。現在、アーカイブにネストされた.tarファイルと.tgzファイルの両方で動作しています。 – berni

+0

コマンドラインではなく、スクリプトと同じコードをどのように実行すればよいですか?ありがとう! – suffa

関連する問題