やっつけスクリプト Returns in python 2.3.4

  • find で抽出したファイルリストにあるファイルを FTP サーバ上で削除する。
  • 前提 : find の対象ディレクトリと FTP サーバ上のディレクトリについて、構成は同じ。
# -*- coding: utf-8 -*-
from ftplib import FTP
from ftplib import error_perm
import logging
import os
import time

### settings
FTP_SERVER = '192.168.1.1'
FTP_USER   = 'ftpuser'
FTP_PASSWD = 'ftpuser'
FTP_HOME   = '/home/ftpuser'
TARGET_FILE_LIST_NAME = 'list.txt'
### settings (end)

LOG_FILE_NAME = 'ftp_' + time.strftime('%Y%m%d_%H%M%S') + '.log'
logger = None

# ログの設定を行います。
def set_logging_option(log_file_name):
    global logger
    logger = logging.getLogger(log_file_name)
    handler = logging.FileHandler(log_file_name, 'w')
    formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
    
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.setLevel(logging.INFO)

# FTPコネクションオブジェクトを作成して戻します。
def ftp_connect(ftp_server, ftp_user, ftp_passwd):
    ftp = FTP(ftp_server)
    message = ftp.login(user=ftp_user, passwd=ftp_passwd)
    logger.info(message)
    return ftp

# 指定されたファイルをFTPで削除します。
def ftp_delete(ftp, target):
    try:
        message = ftp.delete(target)
        logger.info(message + ' ' + target)
    except error_perm:
        logger.error('Delete failed.' + ' ' + target)

# 削除すべきファイルリストを作成します。
def make_delete_file_list(filename):
    os.system("/usr/bin/find /foo/bar -type f -name '*properties' -print > %(filename)s" % locals())

# main
def main():
    set_logging_option()
    make_delete_file_list(TARGET_FILE_LIST_NAME)
    ftp = ftp_connect(FTP_SERVER, FTP_USER, FTP_PASSWD)
    
    for line in file(TARGET_FILE_LIST_NAME, 'r'):
        ftp_delete(ftp, os.path.join(FTP_HOME, line))
    
    ftp.close()
    logger.info('done.')

if __name__ == '__main__':
    main()

ちなみに、このスクリプトは結局使いませんでした。
同僚が書きかけたシェルスクリプトの残骸があることが分かったので、
それを再利用する形で落ち着きました。

$ find /foo/bar -type f -name '*properties' -print > filelist
$ cat sh_header filelist sh_footer | sed -e 's/\foo\bar//' > exec.sh
$ sh ./exec.sh

(sh_header には FTP 接続処理が、sh_footer には クローズ処理が書かれています)