2011-07-13 50 views
9

私は不明な内容のディレクトリをSSH経由で再帰的にダウンロードしたいと思い、Paramikoを試しています。私はディレクトリをアップロードする方法をいくつか見てきましたが、再帰的ダウンロードをカバーするものはありません。Paramikoを使った再帰的なディレクトリダウンロード?

ディレクトリ内のすべてのアイテムを一覧表示できますが、アイテムがファイル(ダウンロードする)かディレクトリ(再帰的に呼び出す)かを知る方法が見つかりませんでした。

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() 

したがって、アイテムがファイルであるか、ディレクトリであるかをどのように知ることができますか?

+0

rsyncにオプションを使用していますか? http://rsync.samba.org –

答えて

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 

: または単純uが

+0

これは今テストできませんが、最後の欠けている部分を完全な答えに追加するようです。ここで受け入れられた旗を移動する。 – Arahman

-5

LinuxまたはUnixのようなものを使用している場合。 Uはpopenと共に 'file'ユーティリティを使うことができます。 sftpがあると仮定すると...

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

+3

適切な英語をお願いします。それ以外に、 'file'を使って何かがフォルダであるかどうかをテストするのは面倒です。そして、リモートファイルで 'os.path.isdir()'を使う..? – ThiefMaster

1

あなたはあなたのSFTPオブジェクトのSTAT()メソッドを使用することができます)=)(os.path.isdir使用することができます開いているParamiko SFTP接続。

+0

ああ、そうかもしれない。それはまだテストされていませんが、少し運があればSFTPAttributes.st_modeからディレクトリフラグを解析することができます。今度は、そのフラグ値がそのモード値に隠れているか調べる必要があります。 – Arahman

2

他の属性の中のstat()メソッドは、パーミッションを返します。 d(たとえばdrwxrwxrwx)は、それがディレクトリであることを示します。一例として、

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

出力interpritation: 01 FIFO 02文字の特殊 04ディレクトリ 06ブロック特別 10通常のファイル 12シンボリックリンク 14ソケット

2

古い質問、しかし、私が思いついた解決策はかなりうまくいきました。それはちょっとちがう(型キャスティングとスラッシュとすべて)ですが、うまくいきます。

ここでは、fabric.api.localを使用して宛先のディレクトリを作成します。

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)