rsyncディレクトリのみが見つかりません

rsyncディレクトリのみが見つかりません

rsync宛先から欠落しているソースディレクトリ(見つからないファイルだけでなくディレクトリ全体)のみを同期させるように指示する方法はありますか?

Sソースディレクトリセットとターゲットディレクトリセットを考慮して、D次のことをしたいと思います。

  • それ以外の場合は、ディレクトリ全体がsここにコピーされます。SsD
  • ssD

もちろん、両方にディレクトリを一覧表示し、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)に対して、ディレクトリがターゲット側に存在し、実行する操作がないか、ソースディレクトリが存在せずに完全にコピーしようとします。dirNrsync --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

おすすめ記事