2010-10-19 41 views

回答

7

看一看的shutil.copytree的源代碼,適應它,並使用:

def copytree(src, dst, symlinks=False, ignore=None): 
    """Recursively copy a directory tree using copy2(). 

    The destination directory must not already exist. 
    If exception(s) occur, an Error is raised with a list of reasons. 

    If the optional symlinks flag is true, symbolic links in the 
    source tree result in symbolic links in the destination tree; if 
    it is false, the contents of the files pointed to by symbolic 
    links are copied. 

    The optional ignore argument is a callable. If given, it 
    is called with the `src` parameter, which is the directory 
    being visited by copytree(), and `names` which is the list of 
    `src` contents, as returned by os.listdir(): 

     callable(src, names) -> ignored_names 

    Since copytree() is called recursively, the callable will be 
    called once for each directory that is copied. It returns a 
    list of names relative to the `src` directory that should 
    not be copied. 

    XXX Consider this example code rather than the ultimate tool. 

    """ 
    names = os.listdir(src) 
    if ignore is not None: 
     ignored_names = ignore(src, names) 
    else: 
     ignored_names = set() 

    os.makedirs(dst) 
    errors = [] 
    for name in names: 
     if name in ignored_names: 
      continue 
     srcname = os.path.join(src, name) 
     dstname = os.path.join(dst, name) 
     try: 
      if symlinks and os.path.islink(srcname): 
       linkto = os.readlink(srcname) 
       os.symlink(linkto, dstname) 
      elif os.path.isdir(srcname): 
       copytree(srcname, dstname, symlinks, ignore) 
      else: 
       copy2(srcname, dstname) 
      # XXX What about devices, sockets etc.? 
     except (IOError, os.error), why: 
      errors.append((srcname, dstname, str(why))) 
     # catch the Error from the recursive copytree so that we can 
     # continue with other files 
     except Error, err: 
      errors.extend(err.args[0]) 
    try: 
     copystat(src, dst) 
    except OSError, why: 
     if WindowsError is not None and isinstance(why, WindowsError): 
      # Copying file access times may fail on Windows 
      pass 
     else: 
      errors.extend((src, dst, str(why))) 
    if errors: 
     raise Error, errors 
2

你只需要copytree使用正確的名稱(或相同名稱)

shutil.copytree("/path/from_dir","/destination/from_dir") 
+0

這是不一樣的,我想複製目錄的內容,而不是目錄 – 2010-10-20 08:32:53

2
import glob 
import subprocess 

subprocess.check_call(["cp", "-rt", "to_dir"] + glob.glob("from_dir/*")) 

有時候自己直接用Python做所有事情是很好的;那麼,再次調用你知道如何控制和知道作品的命令通常更好。

我會毫不猶豫地改寫這個如果當需求發生變化,但在此之前,它的短期和可讀  -  更多的時間更好地用更大的問題。他們如何改變的一個很好的例子是報告一個錯誤:你沒有提到這件事,但是一旦需要,我不會解析cp的輸出。

+0

也值得一提的是'cp'可以產生輸出,你可能不想要。考慮將stdout/stderr發送到'/ dev/null'。 – bstpierre 2010-10-19 11:57:10

+0

這與我現在正在做的事非常相似,但它不是便攜式的 – 2010-10-19 17:22:31

+0

@wiso:您可以使用您的目標平臺/環境更新問題嗎? – 2010-10-19 17:27:10