2012-09-24 4 views
1

전체 디렉토리와 파일을 복사하려고하지만 복사되는 각각의 파일 이름을 인쇄하려고합니다.파이썬에서 재귀 적으로 파일 복사하기

간단히 cp -rf dir dest을 사용하여 os.system으로 전화를 사용했지만 각 파일 이름을 별도로 명확하게 인쇄 할 수 없습니다.

나는 os.system으로 반복적으로 ls를 호출하고, 전체 문자열을 저장하고, 배열에 분할하고, for 루프를 구현하여 os.system ("cp"file1 + "des /")) 그리고 파일 이름을 인쇄하지만, 그것은 많은 일처럼 보입니다.

더 좋은 아이디어가 있습니까?

+3

에 비교했다. – ThiefMaster

+2

'os.walk'과'shutil.copy'를 사용할 수 있습니다. – Blender

+0

-v verbose 옵션을 사용하면 충분하지 않습니다. 파일 이름 – jviotti

답변

4

os.walk을 사용하면 전체 디렉토리 목록을 가져와이 목록을 사용하여 모든 파일을 반복적으로 복사 할 수 있습니다. 또한 MatthewFranglen 년대에 따라

file_paths = [os.path.join(root, f) for root, _, files in os.walk('.') for f in files] 
for path in file_paths: 
    print path 
    shutil.copy(path, target) 

같은 뭔가 그냥 shutil.copytree(src, dst)을 할 수있는 코멘트. 그것은 또한 당신이 일을 무시하도록 허락 할 것이지만, 당신은 목록 이해에 if를 사용하는 대신에 그것을 수행하는 함수를 정의 할 필요가있을 것이다.

# ignore all .DS_Store and *.txt files 
file_paths = [os.path.join(root, f) for root, _, files in os.walk('.') for f in files if (f != '.DS_Store') or f.endswith('.txt'))] 

는 cp``에`-v` 스위치를 추가하고 모든 파일이 복사가 표시됩니다

from shutil import copytree, ignore_patterns 
ignore_func = ignore_patterns('.DS_Store', '*.txt') # ignore .DS_Store and *.txt files 
copytree('/path/to/dir/', '/other/dir', ignore=ignore_func) 
+0

완벽하게 처리되었습니다. – jviotti

+1

os.walk 명령은 디렉토리 (루트), 포함 된 디렉토리 (dir 또는 d) 및 포함 된 파일 (파일 또는 f). 포함 된 디렉토리에 포함 된 파일을 결합하면 작업 할 가능성이 거의없는 경로가 작성되며 확실히 의도 한 경로가 아닙니다. –

+0

@MatthewFranglen 매우 사실이며 편집 된 스크립트는 루트와 파일 이름 (들)을 함께 결합합니다. –

관련 문제