EmptyPage.jp > Gadgets > ftpsite.pl

ftpsite.pl

ローカルのフォルダにある Web コンテンツ用ファイルの更新状態を調べて、前回実行時以降に更新されたファイルのみを FTP でリモートに転送する、よくある類のスクリプトです。

1. 特徴

ローカルで作成した HTML ファイルなどのコンテンツを FTP で転送する作業を自動化します。ローカルでのフォルダ構成をそのままサーバのディレクトリ構成にしていて、Web サイトの更新のためだけに大掛かりな専用の FTP クライアントを使いたくない、という人を対象として想定しています。

実行すると、ローカルにあるファイルの更新時刻を調べて、前回から更新されているものだけを FTP でサーバに転送します。転送するファイルはワイルドカードを使って指定できます。また、転送しないファイルの指定も可能です。

低機能なスクリプトですので、制限があります。詳しくは「注意点」を参照してください。

バージョン 1.2 で、コマンドラインオプション、設定ファイル名、設定の書式などを大幅に変更しました。以前のバージョンをお使いの方はご注意ください。

2. 動作環境

ftpsite.pl は Perl スクリプトです。使用するには Perl が実行できる環境が必要です。作者はこのスクリプトを Perl 5.8 (ActivePerl) で動かしています。

アーカイブに格納されている ftpsite.pl は、エンコーディング UTF-8、改行コード CRLF で記述されています。必要であれば各種ツールで適切な形に変換してください。

3. ダウンロード

4. 使い方

4.1. コマンドライン

ftpsite.pl [オプション] [転送元ディレクトリ]

オプションには以下のものを指定できます。また、各オプションはハイフンに続けて先頭の 1 文字を指定した短い形式でも指定することができます(例: --help-h とも指定できます)。

--all

すべてのファイルを処理対象にします。

--noftp

転送されるファイルの一覧を表示します。転送されるファイルを確認したいときに使います。このオプションを指定すると、転送処理は行われません。

--status

前回のコマンド実行時からの変更状況を表示します。変更状況は、変更があったファイルのパスに、変更の種類を示す文字をつけて表示されます。

出力の例:
M       index.html
A       diary/2006-11-01.html
D       test.html

各文字の意味は次のとおりです。

A
ファイルが追加された。
D
ファイルが削除された。
M
ファイルが更新された。

このオプションを指定すると、転送処理は行われません。

--timestamp

転送対象となる全ファイルのパスと、その更新時刻を表示します。この出力は、スクリプトがファイルの更新時刻を記録しているログファイルの書式と同じです。初回導入時など、リモート側への転送がもう済んでいる場合にログファイルを最新の時刻のものに更新したいときに使います。

このオプションを指定すると、転送処理は行われません。

--verbose

転送時に冗長なメッセージを標準エラー出力 (stderr) に表示します。

--help

コマンドの使い方についての簡単な説明を表示します。

転送先ディレクトリは、ローカルで転送するファイルが置いてあるディレクトリを指定します。省略した場合は、カレントディレクトリが対象になります。指定したディレクトリには、後述の設定ファイルが存在している必要があります。

4.2. 設定ファイルの設置

転送元となるローカルのフォルダには、スクリプトが参照する設定ファイルを用意しておく必要があります。 .ftpsite という名称のテキストファイルを転送元フォルダに用意してください。このファイルには転送先の FTP アドレスと、転送するファイルの指定を書き込みます。

以下は .ftpsite ファイルの例です。

[ftp://taro:fz4XTemj@www.example.com/public_html]
# 以下ファイル指定。
robots.txt
<*.html>
! <test/*>

.ftpsite ファイルには、はじめに転送先の FTP パスを [...] で囲って記述します。それに続けて、ワイルドカードを使った転送ファイルの指定が続きます。

設定ファイルでは、# で始まる行はコメントとして扱われます。

4.2.1. 転送先 FTP パスの指定

転送先の FTP パスは、以下のような URI 形式で記述します。

ftp://username:password@hostname/path/to/dir

:password の部分は省略できます。パスワードを省略した場合、転送時にユーザーに入力を求めるプロンプトが出ます。

4.2.2. 転送するファイルの指定

転送の対象となるファイルは、相対パスを使ったワイルドカードで指定します。1 行がひとつの指定として扱われます。使用しているオペレーティング・システムに関わらず、パス区切りにはスラッシュを使います。

# フォルダ直下の HTML ファイル
*.html
# css フォルダにあるスタイルシート
css/*.css

ワイルドカードの指定を <...> で囲むと、サブディレクトリ以下のファイルも対象になります。転送先の FTP ディレクトリには、同名のフォルダをあらかじめ作成しておく必要があります。対応するフォルダがないファイルは転送に失敗します。

# このフォルダ配下にあるすべての HTML ファイル
<*.html>

指定の冒頭に !(エクスクラメーション)をつけると、該当するファイルを転送しない、という意味になります。次の指定では、設定ファイルと同じフォルダにある _template.html は転送されません。しかし diary/_template.html というファイルがあった場合は転送の対象になります。

# このフォルダ配下にあるすべての HTML ファイル
<*.html>
# 転送しないファイル。
! _template.html

転送しないファイルの指定にも <...> が使えます。次のように指定すれば diary/_template.html も転送されません。

# このフォルダ配下にあるすべての HTML ファイル
<*.html>
# 名前がアンダースコアで始まるファイルは転送しない。
! <_*.*>

転送対象を指定する順番には意味があります。! diary/_template.html という指定をしたあとで <*.html> などと書いてしまうと、前者の設定は意味がなくなってしまいます。設定ファイルの前半には転送するファイルの指定、後半には転送しないファイルの指定というように、まとめておくのがおすすめです。

バージョン 1.2 で意味が変わった指定

バージョン 1.1 まで、<foo/*> という指定は、「(基準ディレクトリ)/foo 配下のすべてのファイル」をあらわしていましたが、1.2 からは意味が変わりました。この指定は新しい ftpsite.pl では「すべてのディレクトリ上で bar/* にマッチするファイル」をあらわします。前者の解釈では bar/foo/index.html はマッチ対象になりませんが、後者ではマッチすることになります。バージョン 1.2 において前者の意味の指定をしたいときには、foo/<*> と指定します。新しい方式により、転送ファイルをより柔軟に指定できるようになりました。

4.3. タイムスタンプのログ

ftpsite.pl を起動して実際に転送をおこなうと、ローカルのディレクトリに .ftpsite.log というファイルが作成されます。このファイルには転送したファイルのパスとそのファイルの更新時刻が記録されています。スクリプトは次回以降、このファイルを参照して更新されたファイルを判断します。このファイルを削除すると、次回実行時にはすべてのファイルを転送することになりますので注意してください。

4.4. 注意点

4.4.1. バージョン 1.2 未満の ftpsite.pl からの移行

バージョン 1.2 において、コマンドラインの書式、設定ファイル名、また設定ファイルでの指定の書式を大幅に変更しました。以前のバージョンをお使いで、バージョン 1.2 を使いたくなった場合、以下の手順で移行してください。

  1. 移行前の ftpsite.pl で ftpsite.pl -all -noftp > ftpsite1.txt と実行して、現在転送対象となっているファイルを記録しておきます。
  2. ftpsite-config.txt をもとに、新しい設定ファイル、.ftpsite を作成します。ファイルの指定方法とその意味が変わっているので、かならずこのドキュメントに目を通し、注意して書き換えてください。
  3. ftpsite-timestamp.txt.ftpsite.log という名前のファイルにコピー(またはリネーム)します。このファイルの書式は以前のバージョンと同じです。
  4. ftpsite.pl を新しいバージョンに差し替えます。
  5. 新しい ftpsite.pl で ftpsite.pl -a -n > ftpsite2.txt を実行して、その出力を移行前の ftpsite1.txt と比べ、転送対象が正しく選ばれているかを確認します(出力をソートしておいたほうがいいかもしれません)。

5. 更新履歴

1.2.1 (2006-12-14)
転送指定の2行め以降の指定が無条件でサブディレクトリ以下にも適用されていたのを修正。
1.2.0 (2006-11-04)
新しいコマンドライン書式と設定ファイル。
1.10 (2004-02-27)
不正なオプションが指定されたときは処理を停止するようにした。
-remoteroot hostname.jp/www といった指定ができるようにした。
1.01 (2003-08-01)
一度転送に失敗したファイルが次回以降転送対象にならなかったのを修正。
1.00 (2003-07-12)
公開。

6. 免責・謝辞

このスクリプトを使用して発生した損害等について作者はその責任を負いません。

このスクリプトのおおもとのアイデアは、結城浩さんが公開されている UpFtp です。UpFtp を試していて、複数のファイルをまとめて指定できるようにしたいと考えたのが開発の動機となりました。また、Net::FTP モジュールの使い方についても UpFtp のコードから学ばせていただきました。UpFtp を書かれた結城さんに感謝します。

なお、ftpsite.pl のコード自体は作者(M.Shibata)が一から書いているので、同スクリプトの不具合その他まずいことがらの原因はすべて作者の M.Shibata にあります。ftpsite.pl についてのご意見は M.Shibata のほうにお寄せください。