rsync
宛先から欠落しているソースディレクトリ(見つからないファイルだけでなくディレクトリ全体)のみを同期させるように指示する方法はありますか?
S
ソースディレクトリセットとターゲットディレクトリセットを考慮して、D
次のことをしたいと思います。
- それ以外の場合は、ディレクトリ全体が
s
ここにコピーされます。S
s
D
s
。s
D
もちろん、両方にディレクトリを一覧表示し、rsync
宛先に一覧表示し、いくつかのタスクを実行し、perl
コピーする必要があるすべてのディレクトリのリストを作成することは可能ですが、1回の呼び出しのみが必要な場合ですrsync
。
たとえば、ソースとターゲットが同じサーバー上にある場合は、次のことができます。
src=/some/where
dst=/else/where
cd /tmp
(cd $src; find . -type d) | sort > a
(cd $dst; find . -type d) | sort > b
comm -23 a b | perl -e 'L: while(<>) {chomp; $p=$_; while ($p=~s,/[^/]+$,,) { next L if $n{$p}; } $n{$_}++; s,^./,/,; print "$_/***\n"}' > tocopy
rsync -vmazn --include-from tocopy --exclude '*' $src/ $dst/
(-n
真であればいいえ)。
PS:上記のperl「1行」は、コピーすることを決定したディレクトリのサブディレクトリを削除することに注意してください(このサブディレクトリは親ディレクトリのコピーに含まれているため)。このレシピは、コピーする最小のディレクトリセットで終わります。
ベストアンサー1
あなたが望むものは何でも、rsyncだけを使ってこれを行う方法は考えられません。
ターゲット側に存在するディレクトリを完全にスキップするには、テストは再帰的ではなく、最上位ディレクトリのみが重要です。コピーする各引数(in)に対して、ディレクトリがターゲット側に存在し、実行する操作がないか、ソースディレクトリが存在せずに完全にコピーしようとします。dirN
rsync --flag-that-you-hope-exists dir1 dir2 dir3 destination/
cd /path/to/source
for x in dir1 dir2 dir3; do
[ -e "/path/to/target/$x" ] || cp -Rp -- "$x" /path/to/target/
done
実際にターゲット側に存在するディレクトリに再帰し、ディレクトリが欠落している場合にのみファイルをコピーしたい場合は、次の方法を使用してfind
ソースディレクトリを反復処理し、それぞれのターゲットディレクトリを確認できます。
cd /path/to/source
find . -type d -exec sh -c '
if [ -e "$0/$1" ]; then exit 0; fi
cp -Rp -- "$1" "$0/$1"
exit 1
' /path/to/target {} \; -prune
ソースまたはターゲットがリモートの場合は、次のコマンドを使用してマウントします。SSHFS。