2011-11-24 4 views
7

주어진 디렉토리에서 추출해야하는 디렉토리가있는 tar 아카이브가 있습니다. 는 예를 들어 추출/A/디렉토리 : I는 I는 예를 들어 주어진 타겟 디렉토리를 추출 할 타르 아카이브 디렉토리주어진 디렉토리에서 디렉토리 경로가있는 모든 파일을 추출합니다.

TarPrefix/X/Y/Z

을 디렉토리 TarPrefix/x/y/z에 들어있는 모든 파일과 디렉토리를 포함해야합니다.

subdir_and_files = [ tarinfo for tarinfo in tar.getmembers() 
         if tarinfo.name.startswith("subfolder/") 
        ] 

은 "/ 하위 폴더"디렉토리 경로에있는 모든 구성원의 목록을 얻으려면 다음 나는 tar.extractall(extracted/a,subdir_and_files) 를 사용하여 추출하지만, 예를 들어 자신의 디렉토리 경로와 모든 구성원을 추출하고이 결과 추출에가// x/y/z. 해당 폴더에서 이러한 파일을 추출하는 데 도움을주십시오. 이미 답을 발견 할 수 있습니다처럼

+0

나도 몰라,하지만이 질문은 일종의 당신의 반대의 것 같다 : HTTP : //stackoverflow.com/questions/2239655/python-tarfile-adding-files-without-directory-hiearchy 아마도 extractall() 대신 extractall()을 사용하고 TarInfo 객체를 수정하여 어떤 일이 발생하는지 확인할 수 있습니다. subdir_and_files에 들어 있니? –

+1

초급자의 질문에 사과드립니다. 나는 파이썬에서 초보자이며 구글에 대한 답변을 찾지 못했습니다. 그런 질문을 한 이유입니다. 다른 사람들을 돕기 위해이 질문에 답하고 싶습니다. tarinfo.name 속성 값을 올바른 값으로 변경하기 만하면됩니다. 즉 주어진 예제에서'tarinfo.name = tarinfo.name [len (Tarprefix/x/y/z) :]'와 같은 코드를 사용하면됩니다. – gaurav

+0

나는 내 자신의 질문에 대답하려고 노력했지만 8 시간이 될 때까지 기다릴 수 없었습니다. – gaurav

답변

12

보이지만 여기 내 버전 어쨌든입니다 :

import sys, tarfile 

def get_members(tar, prefix): 
    if not prefix.endswith('/'): 
     prefix += '/' 
    offset = len(prefix) 
    for tarinfo in tar.getmembers(): 
     if tarinfo.name.startswith(prefix): 
      tarinfo.name = tarinfo.name[offset:] 
      yield tarinfo 

args = sys.argv[1:] 

if len(args) > 1: 
    tar = tarfile.open(args[0]) 
    path = args[2] if len(args) > 2 else '.' 
    tar.extractall(path, get_members(tar, args[1])) 
+0

도와 줘서 고마워. 예, 물건으로 실험 해 보았습니다. :) 어쨌든 고마워. – gaurav

2
with tarfile.open('sourcefile.tgz', 'r:gz') as _tar: 
    for member in _tar: 
     if member.isdir(): 
     continue 
     fname = member.name.rsplit('/',1)[1] 
     _tar.makefile(member, 'desination_dir' + '/' + fname) 
+0

귀하의 답변에 대해 설명해주십시오. – Satendra

관련 문제