FTPサーバーでPHPファイルを編集する必要がありましたが、GVFSマウントに保存するときにローカルエディタを信頼できないため、同期するようにしていrsync
ました。
#!/bin/bash
webroot=/run/user/1002/gvfs/ftp\:host\=ftp.server.com/
while true
do
inotifywait -r -e create -e modify -e close_write -e moved_to ./ | \
mawk '{ print $1 }' | \
while read f
do
# currently, $f is always a directory (not just the changed file)
echo "rsync $f..."
mkdir -p $webroot"$f"
rsync --exclude "*/" -rlpgoD "$f" $webroot"$f"
done
done
このスクリプトは変更されたファイルのディレクトリを同期しますが、非常に遅くなります。だから私は改善しようとしています。
このようなスクリプトをどのように書きますか?理想的には、ディレクトリ全体を同期せずに変更されたファイルのみを同期します。
答え1
スペースがあれば、リモート層のローカルコピーをアーカイブできます。物理階層の変更が原因でinotifyが実行された場合は、物理rsync -a -i
コピーとローカルコピーの間で更新して実際の変更リストを作成できます。このリストは、ローカルコピーからリモートアップデートを再同期するためにのみ使用する必要があります。
この状況を解決するには、rsyncのマニュアルページを参照してください。バッチモード部分。実際のコピーとローカルコピーの間で実行する-i
操作の代わりに、リモートで実行してまったく同じ変更を適用します。 (fooファイルは、すべての変更のコピーを含むバイナリファイルです。)rsync -a --write-batch=foo
rsync -a --read-batch=foo
以下は、/ tmpでa、b、cディレクトリを使用する例です。ここで、aはファイルが編集される実際のディレクトリ、bはリモートデバイスのローカルキャッシュコピー、cはリモートディレクトリです。まず、aを作成してbとcにコピーします。後で変更できるように、cを変数に入れました。
cd /tmp || exit
echo do: rm -fr a b c foo foo.sh
c=c
mkdir a
echo hi >a/f1
echo hi >a/f2
rsync -av a/ b
rsync -av a/ "$c"
3つの同じディレクトリがあります。ディレクトリaを編集します。
echo bye >>a/f1
echo bye >>a/f3
rm -f a/f2
a を b と同期させ、バッチファイル foo を作成します。
rsync -av --delete --write-batch=/tmp/foo a/ b
これで、cのfooに保存されている変更をやり直すことができます。
rsync -av --delete --read-batch=/tmp/foo "$c"
これで、同じディレクトリが3つ以上表示されます。利点は、rsyncがfooファイルに書き込まれた更新のみを実行することです。 c用のローカルftp gvfsマウントを使用してこれを試しましたが、うまくいきませんでした(c="$XDG_RUNTIME_DIR/gvfs/ftp:host=localhost,user=ftp/test/"
)。 gvfsd-fuseマウントは非常にバグが多いように見え、時にはリモートファイルがディレクトリでなければならないと仮定するため、rsyncはそれを絶対に使用しません。