再帰的な diff ディレクトリを作成します。参照と違いをコピーしてください。元のディレクトリを再作成します。

再帰的な diff ディレクトリを作成します。参照と違いをコピーしてください。元のディレクトリを再作成します。

私はそれぞれ、合計サイズが数ギガバイトに達する複数のディレクトリ/ウェブサイトリソースを持っています。彼らは90%以上同じです。時にはいくつかのファイルだけが変更されることがあります。
バックアップのために定期的にこれらのファイルをダウンロードする必要があります。保存スペースは問題ありませんが、ダウンロード時間が長すぎます。

必要なのは、
次のディレクトリを参照(d1)として使用することです。
1.他のディレクトリ(d2)の場合は、d1とd2の間の同じファイルをすべて一覧表示してcommon.txtに保存します。同じは、相対パス(d1とd2内)、ファイル名、およびコンテンツが同じで、所有者/グループとタイムスタンプを無視することを意味します。
2. d1に存在しないd2のすべてのファイル(異種ファイルを含む)をd3にコピーします。

その後、tarballed d1、d3、common.txt を別のコンピュータにダウンロードしました。

d3をd2にコピーします。
3. common.txtにリストされているファイルをd1からd2にコピーします。

(1)、(2)、(3)の手順を解決する方法を提案できますか?

答え1

重複排除を検討してください。新しいファイルを削除してアップロードするのではなく、サーバー上でこれらのファイルを直接変更する方法はありますか?そうでない場合は、同じファイルを直接シンボリックリンクまたはハードリンクできます。これにより、サーバーのストレージ容量が節約され、rsync -Hサポートされているハードリンクを使用するときのダウンロードの問題が自動的に解決されます。ハードリンクトラップ(1つを内部で変更すると、実際には同じファイルであるためすべてが修正されます)を知っている限り、これが最善の解決策です。

fdupesこれを使用して、重複ファイルを効率的に見つけることができます。これにはコンテンツ側の重複が含まれますが、残念ながらファイル名の要件はありません。これを使用して、重複したファイル名のリストをフィルタリングしたり直接比較したりできます。使用find、、、statcmp

完全に改善されていない例:

cd d1
find -type f -exec ./compare.sh d1/{} d2/{}

比較.sh:

if [ -f "$1" -a -f "$2" ]
then
    asize=`stat -c%s "$1"`
    bsize=`stat -c%s "$2"`

    if [ "$asize" == "$bsize" ]
    then
        if cmp "$1" "$2"
        then
            echo IDENTICAL "$1" "$2"
        else
            echo DIFFERENT "$1" "$2"
        fi
    fi
fi

Tarballに言及したので、それをインクルード/除外ファイルのリストに表示しますtar --files-from / --exclude-from

関連情報