2012-05-28 30 views
10

Điều tôi muốn làm là về cơ bản là cp -Rl dir1 dir2. Nhưng khi tôi hiểu nó, python chỉ cung cấp shutils.copytree(src,dst) thực sự sao chép các tệp, nhưng không có khả năng liên kết cứng các tệp thay thế.Tạo đệ quy các liên kết cứng bằng python

Tôi biết rằng tôi có thể gọi lệnh cp sử dụng mô-đun subprocess, nhưng tôi muốn tìm cách dọn dẹp hơn (pythonic) để làm như vậy.

Vì vậy, có một cách dễ dàng để làm như vậy hoặc tôi phải thực hiện nó bản thân mình đệ quy thông qua các thư mục?

+0

Quá trình duyệt thư mục khá dễ dàng, vậy tại sao bạn không thử? – Blender

+2

Nó không phải là về cố gắng hay không cố gắng: Câu hỏi thay vì muốn nói "Tôi không thể tưởng tượng rằng điều này đã không được thực hiện trước hàng trăm lần và do đó phải có sẵn trong mô-đun xy". Việc phát minh lại bánh xe mọi lúc dường như không đúng. – devsnd

Trả lời

15

Bạn chỉ cần gọi os.system("cp -Rl dir1 dir2"), không cần viết tay chức năng của riêng bạn.

Đã chỉnh sửa: Vì bạn muốn thực hiện việc này trong python.

Bạn đang phải: Nó sẵn trong mô-đun shutil

shutil.copytree(src, dst, copy_function=os.link) 
+1

Như tôi đã nói, tôi không muốn sử dụng mô-đun subprocess. Điều đó cũng có nghĩa là tôi sẽ không muốn sử dụng cuộc gọi 'os.system', vì nó mang lại cho tôi ít quyền kiểm soát hơn' subprocess'. Đặc biệt là vì 'os.system' có thể không hoạt động âm thầm. – devsnd

+1

@twall: Lưu ý đây chỉ là Python 3. Trong Python 2, bạn có thể sửa đổi mã ví dụ: http://docs.python.org/library/shutil.html#copytree-example – Kabie

+1

Rất tuyệt! Bây giờ tôi đã sử dụng ví dụ của Damian Ayers và sửa đổi nó theo nhu cầu của tôi, nhưng đây thực sự là giải pháp mà tôi nghĩ đến. (Tôi nên xem xét các nguồn câm trước ...) Cảm ơn bạn! – devsnd

7

Dưới đây là một chức năng trăn cưng tinh khiết. Nên làm việc giống như cp -Rl src dst

import os 
from os.path import join, abspath 

def hardcopy(src, dst): 
    working_dir = os.getcwd() 
    dest = abspath(dst) 
    os.mkdir(dst) 
    os.chdir(src) 
    for root, dirs, files in os.walk('.'): 
     curdest = join(dst, root) 
     for d in dirs: 
      os.mkdir(join(curdst, d)) 
     for f in files: 
      fromfile = join(root, f) 
      to = join(curdst, f) 
      os.link(fromfile, to) 
    os.chdir(working_dir) 
+0

Cảm ơn, điều đó thật tuyệt với tôi, tôi sẽ thử nó. – devsnd

+0

Xin lỗi vì không chấp nhận câu trả lời của bạn, nhưng câu hỏi khác thực sự là câu trả lời đúng cho câu hỏi đó, mặc dù câu trả lời của bạn cũng giải quyết được vấn đề. Cảm ơn một lần nữa. – devsnd

+0

Không phải lo lắng. Tôi đã không nhìn vào python 3 nhiều, nhưng nếu đó là những gì bạn đang ở trên đó là một giải pháp neater xa. :) –