2010-12-01 2 views
3

Мне нужно скопировать все файлы и папки в текущую папку в подкаталог. Какой был бы лучший способ сделать это? Я попробовал следующий фрагмент, но он терпит неудачу, поскольку он терпит неудачу, если каталог назначения уже существует.Рекурсивное копирование файлов в подкаталог

def copy(d=os.path.curdir): 
    dest = "t" 
    for i in os.listdir(d): 
     if os.path.isdir(i): 
      shutil.copytree(i, dest) 
     else: 
      shutil.copy(i, dest) 

У меня такое чувство, что одна и та же задача может быть выполнена лучше и проще. Как мне это сделать?

+0

ли адресат вложенным пуст при запуске копирования? – 2010-12-01 12:52:24

+0

Отрывок полностью ужасно. 1) В чем причина «copytree» на поддиректорах, а не на корне? 2) `d`,` dest` не используются. – khachik 2010-12-01 12:53:26

+0

@khachik извините, написали в спешке. [2] позаботился. – 2010-12-01 12:55:28

ответ

0

Вам действительно нужно использовать python? Поскольку функции shutil не могут скопировать все метаданные файлов и групповые разрешения. Почему бы вам не попробовать встроенные команды OS, такие как cp в linux и xcopy в windows?

Вы можете даже попытаться запустить эти команды из питона

import os 

os.system("cp file1 file2") 

Надеется, что это помогает.

2

Я бы никогда не делал этого на python, но на ум пришло следующее решение. Это не выглядит простым, но он должен работать и может быть упрощено (не проверены, извините, нет доступа к компьютеру в настоящее время):

def copyDirectoryTree(directory, destination, preserveSymlinks=True): 
    for entry in os.listdir(directory): 
    entryPath = os.path.join(directory, entry) 
    if os.path.isdir(entryPath): 
     entrydest = os.path.join(destination, entry) 
     if os.path.exists(entrydest): 
     if not os.path.isdir(entrydest): 
      raise IOError("Failed to copy thee, the destination for the `" + entryPath + "' directory exists and is not a directory") 
     copyDirectoryTree(entrypath, entrydest, preserveSymlinks) 
     else: 
     shutil.copytree(entrypath, entrydest, preserveSymlinks) 
    else: #symlinks and files 
     if preserveSymlinks: 
     shutil.copy(entryPath, directory) 
     else: 
     shutil.copy(os.path.realpath(entryPath), directory) 
1

Чтобы продлить ответ mamnun, в

Если вы хотите для использования прямого вызова в os я бы посоветовал использовать cp -r, поскольку вам, похоже, нужна рекурсивная копия для каталогов.

0

Вот мой вариант рекурсивного метода копирования для питона, кажется, работает :)

def copy_all(fr, to, overwrite=True): 
    fr = os.path.normpath(fr) 
    to = os.path.normpath(to) 

    if os.path.isdir(fr): 
    if (not os.path.exists(to + os.path.basename(fr)) and not 
    os.path.basename(fr) == os.path.basename(to)): 
     to += "/" + os.path.basename(fr) 
     mkdirs(to) 
    for file in os.listdir(fr): 
     copy_all(fr + "/" + file, to + "/") 
    else: #symlink or file 
    dest = to 
    if os.path.isdir(to): 
     dest += "/" 
     dest += os.path.basename(fr) 

    if overwrite and (os.path.exists(dest) or os.path.islink(dest) 
     rm(dest) 

    if os.path.isfile(fr): 
     shutil.copy2(fr, dest) 
    else: #has to be a symlink 
     os.symlink(os.readlink(fr), dest) 


def mkdirs(path):             
    if not os.path.isdir(path): 
    os.makedirs(path) 


def rm(path):              
    if os.path.isfile(path) or os.path.islink(path): 
    os.remove(path) 
    elif os.path.isdir(path): 
    for file in os.listdir(path): 
     fullpath = path+"/"+file 
     os.rmdir(fullpath) 
Смежные вопросы