GNU/Linux >> Linux の 問題 >  >> Linux

2 つのディレクトリを比較し、相違点を 3 番目のディレクトリにコピーする

解決策 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 で試してみたかったのです


Linux
  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. Bash =〜正規表現とHttps://regex101.com/?

  3. バイナリを /bin、/sbin、/usr/bin、および /usr/sbin にインストールし、 --prefix および DESTDIR と対話します

  1. ディレクトリの移動とファイルの実行を 1 つのコマンドで実行

  2. スラッシュと rsync コマンド

  3. scp はディレクトリを再帰的にコピーできますか?

  1. Linux:/ dev / console、/ dev / tty、/ dev / tty0の違いは?

  2. -perm/6000と-perm/u +sの違いを見つけてください。

  3. /dev/sda と /dev/sda1 の違い