2つのフォルダがあります。
ORIGINAL/
ORIGINAL_AND_MY_CHANGES/
私の友人はコピーを持っていますORIGINAL/
。生成したいファイルには。MY_CHANGES.tgz
のみを含める必要があります。その後、私の友人はコピーに解凍して取得できます。ORIGINAL_AND_MY_CHANGES/
ORIGINAL/
ORIGINAL/
ORIGINAL_AND_MY_CHANGES/
どうすればいいですか?
PS試してみましたが、diff
バイナリデータを保存せずにrsync --link-dest
アーカイブから役に立たないハードリンクを作成します。
PPS私が知っている限り、変更時間を使用してどのファイルが変更されたかを判断することはできません。
答え1
rsyncの使用
あなたがやっていることは本質的に増分バックアップです。あなたの友人(あなたのバックアップ)はすでに元のファイルを持っていて、元のファイルから変更されたファイルを含むアーカイブを作成したいと思います。
同期増分バックアップ機能があります。
cd ORIGINAL_AND_MY_CHANGED
rsync -a -c --compare-dest=../ORIGINAL . ../CHANGES_ONLY
-a
すべての属性(時間、所有権など)が保存されることを意味します。-c
日付とサイズに関係なく、ファイルの内容を比較することを意味します。--compare-dest=/some/directory
これは、このディレクトリとソースツリーの同じファイルがコピーされないことを意味します。パスはターゲットディレクトリに相対的です。
Rsync は、ファイルがなくてもすべてのディレクトリをコピーします。これらの空のディレクトリを削除するにはfind -depth CHANGES_ONLY -type d -empty -delete
(またはおよび存在しfind
ない場合)を実行します。-delete
-empty
find -depth CHANGES_ONLY -exec rmdir {} + 2>/dev/null
その後、ディレクトリにアーカイブを作成しますCHANGES_ONLY
。
遊歩道
ファイルを含むディレクトリに移動します。元のファイルと同じファイルはスキップしてください。必要に応じてターゲットにディレクトリを作成します。変更されたファイルをコピーします。
cd ORIGINAL_AND_MY_CHANGES
find . \! -type d -exec sh -c '
for x; do
if cmp -s "$x" "../ORIGINAL/$x"; then continue; fi
[ -d "../CHANGES_ONLY/$x" ] || mkdir -p "../CHANGES_ONLY/${%/*}"
cp -p "$x" "../CHANGES_ONLY/$x"
done
' {} +
答え2
注文する
rsync --only-write-batch=FILE $other_options ORIGINAL_AND_MY_CHANGES/ ORIGINAL/
必要な変更を含むバッチファイルが作成されます(何も変更しません)。
バッチファイルをダウンロードして、利用可能な他のサイトにパッチを適用できます。
rsync --read-batch=FILE ORIGINAL/