2015-11-18 3 views
0

Я пытаюсь создать скрипт на работе, который позволит нам ввести пучку путей к каталогам, а затем рекурсивно скопировать эти каталоги на новый компьютер. Это для нашего процесса обновления компьютера с сотрудниками. Я знаю, что я могу использовать shutil для копирования источника в пункт назначения, но я хотел бы сделать еще один шаг и собрать все исходные каталоги, а затем скопировать их на целевой жесткий диск, используя те же пути каталога.Python: рекурсивно копировать пакет каталогов

Например: SRC = G: \ Пользователи \% specificuser% \ Documents ДСТ = C: \ Users \% specificuser% \ Documents

Я предпочел бы не вводить в источник и место назначения каждый время. Поэтому, наверное, мне сначала нужно знать, возможно ли это в Python. Если да, с чего начать?

+0

все возможно в Python. :) – Pynchia

+0

Вам не нравятся файлы и списки контроля доступа? Метаданные, подобные этому, не будут скопированы с помощью shutil. – Galax

+0

, по-видимому, у адресата есть тот же путь, что и источник, кроме диска, к которому он принадлежит, поэтому вы можете создать пункт назначения на основе источника без повторного ввода – Pynchia

ответ

1

Как насчет:

shutil.copytree(src, dst) 

Или реализовать свой собственный copytree, который пересекает каталоги, создавая их, если это необходимо (позволяет избежать проблемы, что «Каталог назначения не должен уже существовать.», Как указано в комментариях), своего рода синхронизация 1-полосная:

import os, os.path, shutil 

src="G:\\TestCopy" 
dst="D:\\TestCopy" 

def copy_tree(srcpath, dstpath): 
    print(srcpath) 
    if not os.path.exists(dstpath): 
     os.makedirs(dstpath) 
    for candidate in os.listdir(srcpath): 
     srccan = os.path.join(srcpath, candidate) 
     dstcan = os.path.join(dstpath, candidate) 
     if os.path.isdir(srccan): 
      copy_tree(srccan, dstcan) 
     else: 
      shutil.copyfile(srccan, dstcan) 

copy_tree(src, dst) 

Если вы хотите построить строки пользователей на основе конкретного пользователя из частей путей, os.path.join это хорошо делать, что:

specificuser = "fred" 
src = os.path.join("G:\\users", specificuser, "Documents") 
dst = os.path.join("D:\\users", specificuser, "Documents") 
print(src) 
print(dst) 

Выход:

G:\users\fred\Documents 
D:\users\fred\Documents 
+0

, вы должны указать «Целевой каталог еще не существует». , поэтому регулярное повторение процесса от/до одного и того же пути может потребовать дополнительного интеллекта – Pynchia

+0

Да, OP может потребовать что-то немного более тонкое, я отредактирую свой ответ. – Galax

+0

поддержал, но эй, ты пошел на всю длину. Я предполагал, что проблема будет заключаться в повторении копии по тому же пути, то есть когда место назначения уже существует. В таком случае я бы просто переименовал существующий и продолжаю использовать 'shutil.copytree' :) – Pynchia

Смежные вопросы