web-dev-qa-db-ja.com

FTPを介した選択的ミラーリング

Webページをローカルディレクトリと同期させる必要があります。非常に効果的なツールはlftpで、スクリプトで使用します。

   #!/bin/bash
   Host='ftp.remote.it'
   USER='username'
   PASS='password'
   TARGETFOLDER='.'
   BASEFOLDER='/home/my/folder/'
   SOURCEFOLDER='_site'

   cd $BASEFOLDER || exit
   lftp -f "
   open $Host
   user $USER $PASS
   mirror --reverse --only-newer --ignore-time --delete \
          --verbose $SOURCEFOLDER $TARGETFOLDER
   bye
   "

オプション--deleteを使用することで、ファイルをローカルで削除すると、対応するファイルもリモートで削除されるようになります。ただし、ウェブサイトには、ローカルウェブサイトからのものではなく、更新時に削除したくない追加のものを入れました(--deleteの効果はです)リモートフォルダーのすべて、およびローカルフォルダーに存在しないサブフォルダーが削除されます)。

解決策は、最後の更新時にローカルフォルダーに存在するファイルのリストを保持することです。次に、ローカルディレクトリとリストを比較することで、削除されたファイルのリストを取得できます。このように、ローカルWebサイトのミラーリングは2つのステップで行われます。最初にローカルで削除されたファイルに対応するWebサイト上のファイルを削除し、次にlftpを使用してすべての更新された新しいファイルをアップロードしますなしオプション--delete

しかし、驚いたことに、lftp(または他のftpクライアント)がファイルのリストをファイルからリモートで削除する方法を見つけられませんでした。

4
Massimo2013

以下はテストされておらず、 doc を読み取り、rsyncの動作に合わせて調整しています。

Manページによると、mirrorには次のオプションがあります。

        -i RX,   --include=RX               include matching files
        -x RX,   --exclude=RX               exclude matching files
        -I GP,   --include-glob=GP          include matching files
        -X GP,   --exclude-glob=GP          exclude matching files
                 --include-rx-from=FILE
                 --exclude-rx-from=FILE
                 --include-glob-from=FILE
                 --exclude-glob-from=FILE   load include/exclude patterns from the file, one per
                                            line

それらを使用してください。ローカルマシンでリモートで削除したくないファイル、フォルダ、またはグロブ(ワイルドカード)のリストを保持し、lftpにそこにあるものをすべて無視するように指示するだけで、リモートで暗黙的に削除されません。サイド(--delete-excludedスイッチ...)。これらはローカルに存在する必要はありません(その点でrsyncのように動作する場合)。

2
Sven