2つのディレクトリを比較し、3番目のディレクトリの差分をコピーします


32

ubuntu 12.04を実行して、2つのディレクトリ、例えばfolder1 /とfolder2 /を比較し、folder3 /と異なるファイルをコピーしたいです。ネストされたファイルもあるため、一致するサブディレクトリもコピーする必要があります

私を助ける単一のコマンドはありますか?実行中の変更されたファイルの完全なリストを取得できます。

rsync -rcnC --out-format="%f" folder1/ folder2/

しかし、rsyncには、これらのファイルを別のターゲットディレクトリに「エクスポート」する機能がないようです。リストをcpまたは他のプログラムにパイプして、ファイルをコピーし、ディレクトリも作成できますか?たとえば、私は試しました

rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/

しかし、それはディレクトリも保存しません。folder3/内のすべてのファイルを単にコピーします


リストの作成diff -qrawkrsync
にと

リストでrsyncをどのように使用しますか?
ペリリス

forループを実行するか、rsync --include-from=FILEオプションを使用します。
ewwhite

(怠けないでください...)しかし、以下のrsyncソリューションはエレガントです。
ewwhite

回答:


38

--compare-destを使用します。

manページから:

--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スコープの説明があります。


1
このおかげで、このパラメータのマニュアルページの説明を理解できませんでした。興味のある人のために、私はそれをしましたrsync -rcC --compare-dest=folder2/ folder1/ folder3/
13

OsXユーザー向けの簡単なメモ。私はrsync version 3.1.1 protocol version 31自分のローカルにあり、rsyncはparamの~/パスを理解していません--compare-dest
ジェフゲニスミルノフ14

4
私にとっては--compare-dest、絶対パスが必要でした。
palswim

著者またはOPのオプションのいずれかで私のために働いていませんでした。fonts/Makefile.inつまり、ファイルを出力します。これは、両方folder2folder1dirsで同一です。
Hi-Angel

3

この小さなスクリプトは動作するはずです:

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でテスト済み。それが役に立てば幸い。


このおかげで、私は単一のコマンドが存在することを望んでいました
-periklis

2
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ます。PARAMにfolder1/./{}余分が./始まる相対ディレクトリを作成するのrsyncを伝えるために使用される./{}無視して、folder1/。つまり、の作成を回避しfolder3/folder1/ます。

これはCentOS 6.4でしかテストできませんでしたが、知る限りではUbuntu 12.04でも同じように動作するはずです。

編集:smithianの答えは間違いなく優れ ていることに注意する必要rsyncがありますが、目的の出力を提供していたため、元のコマンドをそのまま使用してやりたいと思いました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.