変更したファイルを保存するにはどうすればよいですか?


8

2つのフォルダーがあります。

  • 元の/
  • ORIGINAL_AND_MY_CHANGES /

私の友人はORIGINAL /のコピーを持っています。MY_CHANGES.tgzを生成したい-ORIGINAL /と比較して、ORIGINAL_AND_MY_CHANGES /からの新しいファイルまたは変更されたファイルのみを含める必要がある。したがって、私の友人は、それをORIGINAL /のコピーに解凍して、ORIGINAL_AND_MY_CHANGES /を取得できます。これどうやってするの?

PS私は試しましたdiffが、バイナリデータを保存できませんrsync --link-dest--アーカイブでは役に立たないハードリンクを生成します。

PPS私の場合、変更時刻はどのファイルが変更されたかを判断するために使用できません。


回答:


7

rsyncを使用

あなたがやっていることは本質的に増分バックアップです:あなたの友人(あなたのバックアップ)はすでにオリジナルのファイルを持っています、そしてあなたはそのオリジナルから変更したファイルを含むアーカイブを作りたいです。

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は、を実行します(または、-deleteand がない場合はを-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
' {} +

MY_CHANGESをソース管理に入れ、これらの変更を更新/追跡できるため、enzotibのソリューションよりも優れています(rsyncのバッチファイルをソース管理で更新すると、変更されたファイルを確認できなくなります)
Dmitry

@Dmitryソース管理を使用している場合は、インポート/トラックORIGINALを配置しORIGINAL_AND_MY_CHANGESてブランチを作成しませんか?次にCHANGES、scmコマンドで調べます。
Gilles「SO-悪をやめる」

私の場合、ORIGINALそれはAndroidプラットフォームのソース(3GB、126000ファイル)です。rsyncの実行にも15〜20分かかります。このすべてをソース管理下に追加すると、スペースと時間がかかりすぎると思います。
ドミトリー

@Dmitryそれはそれを解決します。Androidソースの場合は、repoとgitを使用します。自分のブランチで作業します。バージョン管理でそれらを管理するのは十分に難しいので、バージョン管理がないとどうなるのかを考えると身震いする。幸い、gitはローカルブランチの管理に非常に優れています。
Gilles 'SO-悪をやめなさい' 11/11/25

残念ながら、これはカスタムのAndroidソースであり、リポジトリ/ gitリポジトリは含まれていません。
ドミトリー

5

コマンド

rsync --only-write-batch=FILE $other_options ORIGINAL_AND_MY_CHANGES/ ORIGINAL/

(何も変更せずに)必要な変更を含むバッチFILEを作成します。

パッチは、バッチFILEを取得する別のサイトに適用できます。

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