本記事では、例としてLinuxからWindowsへフォルダ単位でファイルをダウンロードする方法をあげます。まず、WinSCPと呼ぶコンピュータ間でファイル転送を行うソフトウェアを使用するのでインストールします。これはオープンソースであり無料です。
本記事のPythonスクリプトは、Windows上で実行することでWinSCPのスクリプト(.bat:バッチファイル)を複製して、Linux上の対象の複数ディレクトリをWindows上へコピーします。
WinSCPのスクリプトは下記で、「WinSCP.bat」と保存して下さい。Linux上のダウンロードしたいフォルダ名は@MY_TARGET_DIR@、ダウンロードしたいフォルダがあるサーバー名(IP)は@MY_TARGET_SERVER@です。
ehcp 65001
echo off
set DIR_PATH=@MY_TARGET_DIR@
cd "C:Program Files\WinSCP\
for /d %%f in (%DIR_PATH%) do (
(
echo.option batch abort
echo.option confirm off
echo.get %%f @MY_DL_DIR@
echo.close
echo.exit
) | winscp.com /command "open @MY_TARGET_SERVER@"
)
そして、Pythonスクリプトは下記で、「WinSCPscript_CREATE_and_RUN.py」とでも保存して下さい。上記.batファイル内の@マークで囲まれた箇所を置換しderive_WinSCP_*.batという名のバッチファイルを複製してから、順次実行してゆく仕組みです。
特記事項としては、引数を3つ持っており下記のようにして実行します。
python WinSCPscript_CREATE_and_RUN.py [pass] [start_num] [end_num]
[pass]はLinuxへのログインパス、[start_num] [end_num]は対象とするディレクトリ名の開始番号と終了番号です(本記事では例として対象ディレクトリ名が番号であるとしているため)。
import sys
import subprocess
def create_bat(original_bat, targetSERVER, targetDIR, DL_DIR, i):
with open(DL_DIR + original_bat, "r") as f1:
with open(DL_DIR + original_bat + "_" + str(i) + ".bat", "w") as f2:
for row in f1:
buf = row.replace("MY_TARGET_SERVER", targetSERVER) \
.replace("MY_TARGET_DIR", targetDIR) \
.replace("MY_DL_DIR", DL_DIR)
f2.write(buf)
def run_bat(num_ST, num_E):
for i in range(int(num_S), int(num_E) + 1):
subprocess.call(["derive_" + original_bat + "_" + str(i) + ".bat"])
if __name__ == '__main__':
if (len(sys.argv) != 4):
print("Arg mismatch")
print("Usage: python WinSCPscript_CREATE_and_RUN.py [pass] [start_num] [end_num]")
sys.exit("input 4 Argments")
original_bat = "WinSCP.bat"
userID = "hk29"
userPASS = sys.argv[1]
SERVER_ADDRESS = 'xxxx'
targetSERVER = userID + ':' + userPASS + '@' + SERVER_ADDRESS
DL_DIR = "C:\\Users\\hk29\\Desktop\\test\\"
num_S = sys.argv[2]
num_E = sys.argv[3]
for i in range(int(num_S), int(num_E) + 1):
targetDIR = '/home/xxx/downloadtargetdir_' + str("{0:03d}".format(i))
create_bat(original_bat, targetSERVER, targetDIR, DL_DIR, i)
run_bat(num_S, num_E)
print('finished')
以上
<広告>
リンク