2013-03-10 97 views
2

我想知道python是否提供了一種將文件複製到其原始主目錄(如cp --parents)的目錄的規範方法。從cp手冊頁:將文件複製到一個目錄中,並附上其原始主目錄

`--parents' 
[...] 
    cp --parents a/b/c existing_dir 

copies the file `a/b/c' to `existing_dir/a/b/c', creating any 
missing intermediate directories. 

我還沒有看到shutil文檔是指這樣的東西。當然,在將任何文件複製到目錄之前,我可以在existing_dir目錄中創建整個目錄結構,但這樣做可能會有開銷。

+0

我覺得這是你發現有此功能的庫的程序自己那種東西。它取決於相對路徑,而'shutil'上的東西不應該爲 – JBernardo 2013-03-11 00:04:38

+0

看看'os'的文檔 - 它聽起來像你想爲路徑模擬一個'mkdir -p',然後將一個文件複製到它? – 2013-03-11 00:42:58

+0

@JonathanVanasco:是的,就是這樣。 – michaelmeyer 2013-03-11 13:52:02

回答

1

我終於用下面的代碼上來。它的行爲幾乎與cp --parents一樣。

import os, shutil 

def cp_parents(target_dir, files): 
    dirs = [] 
    for file in files: 
     dirs.append(os.path.dirname(file)) 
    dirs.sort(reverse=True) 
    for i in range(len(dirs)): 
     if not dirs[i] in dirs[i-1]: 
      need_dir = os.path.normpath(target_dir + dirs[i]) 
      print("Creating", need_dir) 
      os.makedirs(need_dir) 
    for file in files: 
     dest = os.path.normpath(target_dir + file) 
     print("Copying %s to %s" % (file, dest)) 
     shutil.copy(file, dest) 

這樣稱呼它:

target_dir = '/tmp/dummy' 
files = [ '/tmp/dir/file1', '/tmp/dir/subdir/file2', '/tmp/file3' ] 

cp_parents(target_dir, files) 

輸出是:

Creating /tmp/dummy/tmp/dir/subdir 
Copying /tmp/dir/file1 to /tmp/dummy/tmp/dir/file1 
Copying /tmp/dir/subdir/file2 to /tmp/dummy/tmp/dir/subdir/file2 
Copying /tmp/file3 to /tmp/dummy/tmp/file3 

有可能是一個更好的方式來處理這個問題,但它的作品。

0

不確定您的具體要求,但聽起來像shutil.copytree將適合你。你可以看到完整的文檔here,但基本上所有你需要在你的例子調用是一樣的東西

shutil.copytree('a/b/c', 'existing_dir/a/b/c') 
+0

事實上,'shutil.copytree'複製整個源代碼樹,而我想要的只是複製它的一些文件。 – michaelmeyer 2013-03-11 13:46:21

+0

哦,確定它只複製了你指定的目錄和更深層的文件。編輯:重新讀取,在我的答案中將c誤解爲一個目錄,並沒有意識到你的意思是它是一個文件 – 2013-03-11 13:52:33

0
import os 
import shutil 

files = [ '/usr/bin/ls','/etc/passwd' , '/var/log/daily.out' , '/var/log/system.log' , '/var/log/asl/StoreData' ] 

def copy_structure(dst_dir,source_files): 
    if not os.path.exists(dst_dir) and os.path.isdir(dst_dir): 
     os.mkdir(dst_dir) 
    for file in source_files: 
     dir_name = os.path.dirname(file) 
     final_dir_path = os.path.normpath(dst_dir+dir_name) 
     if not os.path.exists(final_dir_path): 
      os.makedirs(final_dir_path)    
     if os.path.exists(file): 
      shutil.copy(file,final_dir_path) 

copy_structure('/tmp/backup',files) 
0

只有3.6或更高版本(它使用f函數)

這是我實現CP的--parents

首先得到補償爲獲得在src目錄和文件名,也爲目錄偏移量(有時我想省略src文件的第一個文件夾)

然後它提取文件夾和文件名(在src_dirs中的檢查是因爲我注意到,當src文件沒有嵌套在它崩潰的任何文件夾)

最後,它創建的目錄樹到目標文件夾並將該文件複製到它

def __copy_parents(src, dest_folder, dir_offset=0): 
    ''' Copies src tree into dest, offset (optional) omits n folders of the src path''' 
    prev_offset = 0 if dir_offset == 0 else src.replace('/', '%', dir_offset - 1).find('/') + 1 
    post_offset = src.rfind('/') 

    src_dirs = '' if post_offset == -1 else src[prev_offset:post_offset] 
    src_filename = src[post_offset + 1:] 

    os.makedirs(f'{dest_folder}/{src_dirs}', exist_ok=True) 
    shutil.copy(src, f'{dest_folder}/{src_dirs}/{src_filename}') 
相關問題