コマンドラインからFTPにファイルを再帰的にアップロードしたかったのだけど、ftp
コマンドやRubyのNet::FTPはファイル1つをコピーとか、低レベルの操作しか用意されてない。
そこでNet::FTP
を拡張して、再帰的にコピーするメソッドを追加したクラスを作ってみた:
# ftpext.rb |
これを使って、コマンドラインからコピー元のローカルディレクトリと転送先のディレクトリを指定するとコピーするスクリプト:
# ftp-cp-r.rb |
これを使って、
$ ruby ftp-cp-r.rb --host=ホスト名 --user=ユーザ名 --password=パスワード "ローカルディレクトリ" "リモートディレクトリ" |
で再帰的にコピーできる。
lsで取得できるFTPのディレクトリに含まれるファイル一覧の結果はサーバ次第?で、テストしたサーバではファイルの日付は取れるが時刻を取得する方法がわからなかったls -R
だと時刻も返ってくるが、カレントディレクトリだけじゃなくサーバに含まれるファイル全体が返ってきてしまった6ヶ月未満だと年が含まれない、とかいう話も- ディレクトリのファイル一覧の取得はmlsdで変更時刻など詳しい内容が取得できる
本来なら「日付が新しかったらコピー」という条件を選べるといいと思うが、上記の件もありひとまずサイズが違ったらで--update
コマンドラインオプションでローカルファイルのほうが新しかったら、--size
オプションでサイズが違ったらアップロードできるようにしました