2

私たちのストレージエリアはSMB接続で問題が発生し、現在はFTPを使用して定期的にファイルにアクセスすることを余儀なくされています。したがって、Bashを使用するのではなく、Pythonを使用しようとしていますが、いくつかの問題が発生しています。スクリプトは、FTPディレクトリを再帰的に検索し、24時間より新しいすべてのファイル「*1700_m30.mp4」を見つける必要があります。次に、これらすべてのファイルをローカルにコピーします。

これは私がこれまでに得たものです-しかし、ファイルをダウンロードするためのスクリプトを取得したり、24時間より新しいかどうかを示すファイルから統計を取得したりすることはできないようです。

#!/usr/bin/env python
# encoding: utf-8

import sys
import os
import ftplib
import ftputil
import fnmatch
import time

dir_dest = '/Volumes/VoigtKampff/Temp/TEST1/' # Directory where the files needs to be downloaded to
pattern = '*1700_m30.mp4' #filename pattern for what the script is looking for 
print 'Looking for this pattern :', pattern # print pattern


print "logging into GSP" # print 
host = ftputil.FTPHost('xxx.xxx','xxx','xxxxx') # ftp host info
recursive = host.walk("/GSPstor/xxxxx/xxx/xxx/xxx/xxxx",topdown=True,onerror=None) # recursive search 
for root,dirs,files in recursive:
    for name in files:
        print 'Files   :', files # print all files it finds
        video_list = fnmatch.filter(files, pattern)
        print 'Files to be moved :', video_list # print list of files to be moved 
        if host.path.isfile(video_list): # check whether the file is valid 
            host.download(video_list, video_list, 'b') # download file list 



host.close  

これは、ottomeisterからの優れた推奨事項に基づいて変更されたスクリプトです(ありがとうございます!!)-最後の問題は、ダウンロードすることですが、ファイルをダウンロードし続け、既存のファイルを上書きし続けます:

import sys
import os
import ftplib
import ftputil
import fnmatch
import time
from time import mktime
import datetime
import os.path, time 
from ftplib import FTP


dir_dest = '/Volumes/VoigtKampff/Temp/TEST1/' # Directory where the files needs to be downloaded to
pattern = '*1700_m30.mp4' #filename pattern for what the script is looking for 
print 'Looking for this pattern :', pattern # print pattern
utc_datetime_less24H = datetime.datetime.utcnow()-datetime.timedelta(seconds=86400) #UTC time minus 24 hours in seconds
print 'UTC time less than 24 Hours is: ', utc_datetime_less24H.strftime("%Y-%m-%d %H:%M:%S") # print UTC time minus 24 hours in seconds
print "logging into GSP FTP" # print 


with ftputil.FTPHost('xxxxxxxx','xxxxxx','xxxxxx') as host: # ftp host info
    recursive = host.walk("/GSPstor/xxxx/com/xxxx/xxxx/xxxxxx",topdown=True,onerror=None) # recursive search 
    for root,dirs,files in recursive:
        for name in files:
            print 'Files   :', files # print all files it finds
            video_list = fnmatch.filter(files, pattern) # collect all files that match pattern into variable:video_list
            statinfo = host.stat(root, video_list) # get the stats from files in variable:video_list
            file_mtime = datetime.datetime.utcfromtimestamp(statinfo.st_mtime) 
            print 'Files with pattern: %s and epoch mtime is: %s ' % (video_list, statinfo.st_mtime)
            print 'Last Modified: %s' % datetime.datetime.utcfromtimestamp(statinfo.st_mtime) 
            if file_mtime >= utc_datetime_less24H: 
                for fname in video_list:
                    fpath = host.path.join(root, fname)
                    if host.path.isfile(fpath):
                        host.download_if_newer(fpath, os.path.join(dir_dest, fname), 'b') 

host.close()
4

1 に答える 1

5

この行:

    video_list = fnmatch.filter(files, pattern)

globパターンに一致するファイル名のリストを取得します。しかし、この行:

    if host.path.isfile(video_list): # check whether the file is valid 

host.path.isfile()引数としてファイル名のリストを必要としないため、偽物です。単一のパス名が必要です。video_listしたがって、一度に1つのパス名を作成し、それらの各パス名をに渡しhost.path.isfile()、場合によってはその特定のファイルをダウンロードすることを繰り返す必要があります。このようなもの:

    import os.path

    for fname in video_list:
        fpath = host.path.join(root, fname)
        if host.path.isfile(fpath):
            host.download(fpath, os.path.join(dir_dest, fname), 'b')

host.path.join()リモートパス名の管理とローカルパス名の管理に使用していることに注意してos.path.join()ください。また、これにより、ダウンロードされたすべてのファイルが1つのディレクトリに配置されることに注意してください。それらをリモートレイアウトを反映するディレクトリ階層に配置する場合(異なるリモートディレクトリのファイル名が衝突する可能性がある場合は、そのようなことを行う必要があります)、別の宛先パスを作成する必要があります。おそらく、ローカルの宛先ディレクトリ階層も作成する必要があります。

タイムスタンプ情報を取得するには、シンボリックリンクの処理方法に応じて使用しますhost.lstat()host.stat()

そして、はい、それはそうあるべきですhost.close()。これがないと、変数がスコープ外になり、ガベージコレクションされた後に接続が閉じられhostますが、明示的に閉じることをお勧めします。さらに良いことに、次のように、例外によってこのコードが呼び出しにwith到達する前に破棄された場合でも、接続が確実に閉じられるように句を使用します。host.close()

    with ftputil.FTPHost('xxx.xxx','xxx','xxxxx') as host: # ftp host info
        recursive = host.walk(...)
        ...
于 2012-06-26T17:34:54.000 に答える