2011-07-13 31 views
9

Tôi muốn tải xuống một thư mục có nội dung không xác định đệ quy qua SSH và đã thử dùng Paramiko. Tôi đã thấy một số ví dụ làm thế nào để tải lên thư mục nhưng không có bao gồm tải xuống đệ quy.Tải xuống thư mục đệ quy với Paramiko?

Tôi có thể liệt kê tất cả các mục trong một thư mục nhưng không thể tìm cách biết mục đó là tệp (tải xuống) hoặc thư mục (gọi đệ quy).

transport = paramiko.Transport((MY_IP, 22)) 
transport.connect(username=MY_NAME, password=MY_PASS) 
sftp = paramiko.SFTPClient.from_transport(transport) 

file_list = sftp.listdir(path='/home/MY_HOME_DIR') 
    for item in file_list: 
     # Here is an item name... but is it a file or directory? 
     print(item) 
sftp.close() 
transport.close() 

Vậy làm cách nào để biết một mục là tệp hay đó là một thư mục?

+0

Bạn đang sử dụng tùy chọn rsync? http://rsync.samba.org –

Trả lời

10
from stat import S_ISDIR 

def isdir(path): 
    try: 
    return S_ISDIR(sftp.stat(path).st_mode) 
    except IOError: 
    #Path does not exist, so by definition not a directory 
    return False 

... giả sftp là một kết nối SFTP Paramiko mở.

+0

Không thể kiểm tra điều này ngay bây giờ, nhưng điều này dường như thêm mảnh còn thiếu cuối cùng vào một câu trả lời hoàn chỉnh. Di chuyển cờ được chấp nhận tại đây. – Arahman

-5

Nếu bạn sử dụng Linux hoặc Unix. U có thể sử dụng tiện ích 'file' với popen. Hoặc đơn giản u có thể sử dụng os.path.isdir() =)

+3

Xin vui lòng nói tiếng Anh. Bên cạnh đó, bằng cách sử dụng 'tập tin' để kiểm tra nếu một cái gì đó là một thư mục hay không là khá lộn xộn. Và sử dụng 'os.path.isdir()' trên một tập tin từ xa ..? – ThiefMaster

1

Bạn có thể sử dụng phương pháp stat() của đối tượng sftp của bạn:

http://www.lag.net/paramiko/docs/paramiko.SFTPClient-class.html

+0

À vâng, có thể là vậy. Chưa thử nghiệm nhưng với một chút may mắn, cờ thư mục có thể được phân tích cú pháp khỏi SFTPAttributes.st_mode. Bây giờ tôi chỉ cần nghiên cứu những gì cờ được ẩn trong giá trị chế độ đó ... – Arahman

2

phương thức stat() trong số các thuộc tính khác trả về quyền. d (ví dụ drwxrwxrwx) cho thấy rằng nó là thư mục.

Một ví dụ:

dir = oct(sftp.stat(path).st_mode) 
print dir[0:2] 

đầu ra interpritation: 01 fifo 02 ký tự đặc biệt 04 thư mục 06 khối đặc biệt 10 thường xuyên tập 12 liên kết tượng trưng 14 ổ cắm

2

Một câu hỏi cũ, nhưng một giải pháp tôi đã đưa ra rằng hoạt động khá tốt, đó là một chút cẩu thả (typecasting và slashes và tất cả) - nhưng nó hoạt động.

Lưu ý việc sử dụng này fabric.api.local để tạo các thư mục ở đích.

def sftp_get_recursive(path, dest, sftp=sftp): 
    item_list = sftp.listdir(path) 
    dest = str(dest) 

    if not os.path.isdir(dest): 
     local("mkdir %s" % dest) 

    for item in item_list: 
     item = str(item) 

     if is_directory(path + "/" + item, sftp): 
      sftp_get_recursive(path + "/" + item, dest + "/" + item, sftp) 
     else: 
      sftp.get(path + "/" + item, dest + "/" + item) 
Các vấn đề liên quan