2014-09-15 3 views
0

Я нашел example как переместить все файлы рекурсивно, но я хотел бы сохранить ту же структуру папок в папке назначения.Рекурсивный поиск файлов с python

import fnmatch 
import os 
import shutil 

rootPath = '/Volumes/VoigtKampff/Temp/TEST/' 
destDir = '/Volumes/VoigtKampff/Temp/TEST2/' 


matches = [] 
for root, dirnames, filenames in os.walk(rootPath): 
    for filename in fnmatch.filter(filenames, '*.mp4'): 
     matches.append(os.path.join(root, filename)) 
     print(os.path.join(root, filename)) 
     shutil.move(os.path.join(root, filename), os.path.join(destDir, filename)) 

Как можно изменить приведенный выше код, чтобы сохранить одну и ту же структуру папок в папке назначения?

+0

Используется mv? – xavier

ответ

2

(Этот ответ подразумевает, что вы работаете в Python 2.x)

Вы должны сделать подкаталоги, как вы идете:

import fnmatch 
import os 
import shutil 

rootPath = '/Volumes/VoigtKampff/Temp/TEST/' 
destDir = '/Volumes/VoigtKampff/Temp/TEST2/' 

matches = [] 

for root, dirnames, filenames in os.walk(rootPath): 
    for filename in fnmatch.filter(filenames, '*.mp4'): 
     matches.append(os.path.join(root, filename)) 
     print(os.path.join(root, filename)) 
     targetDir = os.path.join(destDir, root[len(rootPath):]) 
     if not os.path.exists(targetDir): 
      os.makedirs(targetDir) 
     shutil.move(os.path.join(root, filename), os.path.join(targetDir, filename)) 

Также обратите внимание, что имена верблюжьего не стандартная практика в Python. Взгляните на PEP8: http://legacy.python.org/dev/peps/pep-0008/

+0

В python3 'os.makedirs' включает в себя флаг' exist_ok', который обходит условия гонки, присутствующие здесь –

+0

@AdamSmith - хорошая точка; Я предполагал здесь сценарий Python 2.x. – JKesMc9tqIQe9M

+0

только что заметил print(), поэтому, я думаю, это должен был быть Python 3 в конце концов! – JKesMc9tqIQe9M

0

Почему бы не просто сделать os.system('your mv command')?

+1

Может быть, независимо от ОС? – 2014-09-15 03:01:11

1

Чтобы переместить все файлы из .mp4root_dir директории dest_dir каталога рекурсивно, сохраняя структуру каталогов относительно root_dir:

#!/usr/bin/env python3 
from pathlib import Path 
from shutil import move 

src = Path(root_dir) 
dest = Path(dest_dir) 
for file in src.rglob('*.mp4'): 
    dest_file = dest/file.relative_to(src) 
    try: 
     dest_file.parent.mkdir(parents=True) 
    except OSError: 
     pass # ignore 
    move(str(file), str(dest_file)) 

Он использует pathlib библиотеку, которая доступна в STDLIB поскольку Python 3.4. Чтобы установить его на более ранние версии:

$ pip install pathlib 
Смежные вопросы