EmptyPage.jp > Gadgets > ftpsite.pl
ローカルのフォルダにある Web コンテンツ用ファイルの更新状態を調べて、前回実行時以降に更新されたファイルのみを FTP でリモートに転送する、よくある類のスクリプトです。
ローカルで作成した HTML ファイルなどのコンテンツを FTP で転送する作業を自動化します。ローカルでのフォルダ構成をそのままサーバのディレクトリ構成にしていて、Web サイトの更新のためだけに大掛かりな専用の FTP クライアントを使いたくない、という人を対象として想定しています。
実行すると、ローカルにあるファイルの更新時刻を調べて、前回から更新されているものだけを FTP でサーバに転送します。転送するファイルはワイルドカードを使って指定できます。また、転送しないファイルの指定も可能です。
低機能なスクリプトですので、制限があります。詳しくは「注意点」を参照してください。
バージョン 1.2 で、コマンドラインオプション、設定ファイル名、設定の書式などを大幅に変更しました。以前のバージョンをお使いの方はご注意ください。
ftpsite.pl は Perl スクリプトです。使用するには Perl が実行できる環境が必要です。作者はこのスクリプトを Perl 5.8 (ActivePerl) で動かしています。
アーカイブに格納されている ftpsite.pl は、エンコーディング UTF-8、改行コード CRLF で記述されています。必要であれば各種ツールで適切な形に変換してください。
ftpsite.pl [オプション] [転送元ディレクトリ]
オプションには以下のものを指定できます。また、各オプションはハイフンに続けて先頭の 1 文字を指定した短い形式でも指定することができます(例: --help は -h とも指定できます)。
すべてのファイルを処理対象にします。
転送されるファイルの一覧を表示します。転送されるファイルを確認したいときに使います。このオプションを指定すると、転送処理は行われません。
前回のコマンド実行時からの変更状況を表示します。変更状況は、変更があったファイルのパスに、変更の種類を示す文字をつけて表示されます。
M index.html A diary/2006-11-01.html D test.html
各文字の意味は次のとおりです。
このオプションを指定すると、転送処理は行われません。
転送対象となる全ファイルのパスと、その更新時刻を表示します。この出力は、スクリプトがファイルの更新時刻を記録しているログファイルの書式と同じです。初回導入時など、リモート側への転送がもう済んでいる場合にログファイルを最新の時刻のものに更新したいときに使います。
このオプションを指定すると、転送処理は行われません。
転送時に冗長なメッセージを標準エラー出力 (stderr) に表示します。
コマンドの使い方についての簡単な説明を表示します。
転送先ディレクトリは、ローカルで転送するファイルが置いてあるディレクトリを指定します。省略した場合は、カレントディレクトリが対象になります。指定したディレクトリには、後述の設定ファイルが存在している必要があります。
転送元となるローカルのフォルダには、スクリプトが参照する設定ファイルを用意しておく必要があります。 .ftpsite という名称のテキストファイルを転送元フォルダに用意してください。このファイルには転送先の FTP アドレスと、転送するファイルの指定を書き込みます。
以下は .ftpsite ファイルの例です。
[ftp://taro:fz4XTemj@www.example.com/public_html] # 以下ファイル指定。 robots.txt <*.html> ! <test/*>
.ftpsite ファイルには、はじめに転送先の FTP パスを [...] で囲って記述します。それに続けて、ワイルドカードを使った転送ファイルの指定が続きます。
設定ファイルでは、# で始まる行はコメントとして扱われます。
転送先の FTP パスは、以下のような URI 形式で記述します。
ftp://username:password@hostname/path/to/dir
:password の部分は省略できます。パスワードを省略した場合、転送時にユーザーに入力を求めるプロンプトが出ます。
転送の対象となるファイルは、相対パスを使ったワイルドカードで指定します。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.1 まで、<foo/*> という指定は、「(基準ディレクトリ)/foo 配下のすべてのファイル」をあらわしていましたが、1.2 からは意味が変わりました。この指定は新しい ftpsite.pl では「すべてのディレクトリ上で bar/* にマッチするファイル」をあらわします。前者の解釈では bar/foo/index.html はマッチ対象になりませんが、後者ではマッチすることになります。バージョン 1.2 において前者の意味の指定をしたいときには、foo/<*> と指定します。新しい方式により、転送ファイルをより柔軟に指定できるようになりました。
ftpsite.pl を起動して実際に転送をおこなうと、ローカルのディレクトリに .ftpsite.log というファイルが作成されます。このファイルには転送したファイルのパスとそのファイルの更新時刻が記録されています。スクリプトは次回以降、このファイルを参照して更新されたファイルを判断します。このファイルを削除すると、次回実行時にはすべてのファイルを転送することになりますので注意してください。
ファイルの転送はすべてバイナリモードでおこないます。テキストのエンコーディングや改行コードがあらかじめ適切な状態になっているファイルを用意してください。
ftpsite.pl は、サーバにディレクトリを新たに作る機能は持っていません。ローカルに新たにフォルダを作成した場合は、手動でサーバにログインして対応するディレクトリを作成しておいてください。
ftpsite.pl は、サーバのファイルやディレクトリを削除する機能も持っていません。ローカルから不要になったファイルを削除した場合は、手動でサーバにログインして対応するファイルを削除する必要があります。
バージョン 1.2 において、コマンドラインの書式、設定ファイル名、また設定ファイルでの指定の書式を大幅に変更しました。以前のバージョンをお使いで、バージョン 1.2 を使いたくなった場合、以下の手順で移行してください。
このスクリプトを使用して発生した損害等について作者はその責任を負いません。
このスクリプトのおおもとのアイデアは、結城浩さんが公開されている UpFtp です。UpFtp を試していて、複数のファイルをまとめて指定できるようにしたいと考えたのが開発の動機となりました。また、Net::FTP モジュールの使い方についても UpFtp のコードから学ばせていただきました。UpFtp を書かれた結城さんに感謝します。
なお、ftpsite.pl のコード自体は作者(M.Shibata)が一から書いているので、同スクリプトの不具合その他まずいことがらの原因はすべて作者の M.Shibata にあります。ftpsite.pl についてのご意見は M.Shibata のほうにお寄せください。
Last Modified: 2009-01-19