解決策 1:
--compare-dest を使用してください。
マニュアルページから:
<ブロック引用>--compare-dest=DIR - このオプションは、rsync に宛先マシンの DIR を追加の階層として使用して、宛先ファイルを転送の実行と比較するように指示します (ファイルが宛先ディレクトリにない場合)。送信者のファイルと同一のファイルが DIR にある場合、そのファイルは宛先ディレクトリに転送されません。これは、以前のバックアップから変更されたファイルのみのスパース バックアップを作成する場合に便利です。
最初に --dry-run で構文をチェックしてください
rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/
出力に満足したら、
rsync -aHxv --progress --compare-dest=folder2/ folder1/ folder3/
このリンクには、 --compare-dest スコープの適切な説明があります。
解決策 2:
この小さなスクリプトは動作するはずです:
folder1="firsts_folder/"
folder2="second_folder/"
folder3="target_folder"
for x in `rsync -rcnC --out-format="%n" $folder1 $folder2`
do
if [ -d "$folder1/$x" ]; then
mkdir -p "$folder3/$x"
else
cp -frv $folder1/$x $folder3/$x
fi
done
しかし、diff -qr の出力を解析する方が、各ファイルのパスと名前が一貫して得られるため、より良い解決策になると思います。
編集
これは 1 つのコマンドであり、コマンドはわずかに変更されています。しかし、それは folder1
を作成します folder3
の下 .また、フル パスでは機能しませんが、上記のスクリプトもフル パスでは機能しません。
rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/
\"
を使用しました rsync
で 空白を含むファイルとディレクトリで機能するようにします。 Ubuntu 10.04 でテスト済み。お役に立てば幸いです。
解決策 3:
rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/
最初に folder1
に降りる気があるなら、これが私が思いつく最も簡単な形式です。 コマンドを発行する前に。
これは遅い オプションですが、要件を満たしていると思います。非相対ディレクトリ名を使用して実行できます:
rsync -rcnC --out-format="%n" folder1/ folder2/ |grep -vP "/$" |xargs -I{} rsync -R folder1/./{} folder3/
元の rsync
を残しました あなたはそれが正しいファイルリストを与えていると言ったので、コマンドだけで。
grep
rsync
の出力からディレクトリ名を削除するためにあります .
grep
の出力 その後、別の rsync
にパイプされます xargs
を使用 .パラメータ folder1/./{}
で 余分な ./
./{}
で始まる相対ディレクトリを作成するように rsync に指示するために使用されます 、folder1/
を無視します .つまり、folder3/folder1/
の作成を回避します。 .
これは CentOS 6.4 でしかテストできませんでしたが、私の知る限り、Ubuntu 12.04 でも同じように動作するはずです。
編集: スミシアン の答えは間違いなく優れていますが、元の rsync
で試してみたかったのです