lftpコマンドを使ってFTPサーバとデータを同期する方法

2019.11.19

使用している環境について

WSL を使って ubuntu をインストールしています。
バージョンは次のとおりです。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"

ubuntu の場合は、cat /etc/lsb-releaseコマンドでディストリビューションのバージョンを調べることができます。

lftp のインストール

lftp コマンドを使用するためにはインストールする必要があります。
次のコマンドを実行するとインストールできます。

sudo apt install lftp

実行方法

lftp を使って対話型でサーバへファイルをアップロードする方法もありますが、今回はスクリプト実行する方法を紹介します。

lftp のスクリプトファイル書いておき、実行時にそのファイルを指定することでスクリプト実行できます。

実行方法は下記のような形になります。

lftp -f [スクリプトファイル名]

まず、適当なファイル名でスクリプトファイルを作成して、処理を記述します。

vi scriptname

下記のように記述します。
これは、FTP サーバからローカルへファイルをダウンロードしてくる例です。

open -u user,pass xxx.xxx.xxx.xxx
mirror /server/path /local/path
echo end
close
quit

スクリプトファイルを作成したら、lftp コマンドのパラメータにスクリプトファイルを指定して、実行します。

lftp -f scriptname

スクリプトファイルの簡単な説明

スクリプトファイルに記述するコマンドを説明します。
openは FTP サーバへ接続します。

open -u [ユーザー名],[パスワード] [FTPサーバのIPかホスト名]

mirrorは、同期元の内容を同期先へ処理を行います。

mirror [オプション] [同期元] [同期先]

実行前のイメージでは次のようになっています。

同期元同期先
fileAfileC
fileB

実行すると次のようになります。

同期元同期先
fileAfileA
fileBfileB
fileC

ミラーリングを試行する

間違って記述してしまったスクリプトを実行してしまうと困ったことになります。
そのため、--dry-runオプションを使って試行できます。

mirror --dry-run --log=test.log /server/path /local/path

--log=test.logオプションを付けておくと、指定した場所に試行した結果のログが出力されます。

ログの内容を確認して、スクリプトの記述に間違いが無いか確認しましょう。

FTP サーバへデータをアップロードする

「-R」オプションを付けることで、ローカルのデータを FTP サーバへアップロードできます。
この例では/local/pathの内容を/server/pathにアップロードしています。

mirror -R /local/path /server/path

さらに、「–delete」オプションを付けることで、同期先にのみ存在するファイルを削除する事ができます。
この例では、サーバにのみ存在するファイルは削除され、ローカルと同じ状態になります。

mirror -R --delete /local/path /server/path

--only-newerオプションを付けると、更新されているファイルだけがアップロード対象になります。

mirror -R --delete --only-newer /local/path /server/path

特定のファイルを対象外にしたい

-Xオプションを使用すると特定のファイルやディレクトリを除外する事ができます。

mirror -R -X .git/ -X .desktop.ini -X .DS_Store --delete --log=lftp.log /local/path /server/path

このようにしておくと、.git/ディレクトリ、 .desktop.iniファイル、.DS_Storeファイルが同期対象から除外されます。

最後に私がよく使うスクリプトを紹介

ローカルの画像ファイルディレクトリとサーバのディレクトリを同期しています。

スクリプトの内容。

open -u user,pass xxx.xxx.xxx.xxx
mirror -R -X .desktop.ini -X .DS_Store --delete --log=lftp.log /local/path /server/path
echo end
close
quit

実行するときは、lftp -f lfptscriptのようなコマンドを書いたmirror.shシェルスクリプトを実行しています。

関連記事