2011-09-21 3 views
6

テキストファイルなどのファイルレベルのパッチを作成するソリューションはたくさんあります。私が探しているのは、oldversion/newversion /を比較する簡単なスクリプト/シェルコマンドです。oldversionをコピーしてnewversionと同じにする必要があるファイルのツリーを私に渡します(ファイルは更新されたファイルバージョン)。 2つのフォルダには、バイナリファイルとテキストファイルの両方が含まれています。ファイル/フォルダレベルパッチ(バイナリファイルを含む)を作成するための2つのディレクトリツリーの相違

以前、我々はハックを使用していた。

fdupes -qrf newversion/ oldversion/ | grep "newversion" | xargs rm;

をパッチとしてパッケージ化することができ、フォルダ「NEWVERSION」を私たちに残して。

fdupesはファイル名を考慮していないため、残念ながら、これは悲惨であることが判明しました。

fdupesのようなものは、実際には比較のファイル名を含んでいます。

+0

「新しい」ファイルのリストのみを探していますが、newversion /の「変更された」ファイルは探していませんか? –

+0

新しいファイルと変更されたファイルの両方。 –

答えて

5

diffコマンドは異なり、出力ファイル名に尋ねたことができます。もちろん

diff --quiet --recurse --unidirectional-new-file OLDDIR NEWDIR 

Files old/main and new/main differ 
Files old/main.cpp and new/main.cpp differ 
Files old/Makefile and new/Makefile differ 
Files old/sounds/popalien.wav and new/sounds/popalien.wav differ 
Files old/sounds/saucer.wav and new/sounds/saucer.wav differ 

、それは素敵な出力ではありませんが、あなたが唯一のパッチとしてパッケージ化する新しいファイルを探していることから、迅速なSEDパイプは驚異を働かせる:

diff --quiet --recurse -unidirectional-new-file OLDDIR NEWDIR | \ 
    sed "s/^.* and \(.*\) differ/\1/" 

(読みやすくするために壊れました) 'と' と先行周り

new/main 
new/main.cpp 
new/Makefile 
new/sounds/popalien.wav 
new/sounds/saucer.wav 

スペースが

オペランドの順序を '異なります'差をつけるには差をつけ、最初の引数は 'と'のままにして、2番目は後にします。それに気をつけろ。

また、NEWDIRからファイルを削除すると、指定されたファイル、追加または変更されたファイルだけが削除されます。どちらのサブディレクトリにもないファイルのファイル名も出力するには、--unidirection-new-fileを--new-fileに置き換えます。 (短いオプションは、 - 無方向性を除くすべてのものに存在します。)

1

diff -ruN oldversion newversion

0

私はそれが長い時間知っています。私は同じ解決策が必要でした。私はこの投稿を見つけましたが、それは十分ではありませんでした。その後、私はrsyncが同じコピーを `` patch``して実行できることを発見し、他の変更とマージする必要はありません。私は接続されていないマシンでyumミラーを更新する際にこれを使うつもりです。私の完全なソリューションは、もう少し複雑です、と私はいくつかの細かい詳細が間違っている可能性メモリからコマンドを書いていますが、コアで:

# create identical copy "copy.0" 
rsync -a master/ copy.0/ 

# Presumably transfer copy.0/ to another machine for offline use 
# but copy.0 must not mutate outside of this process or sync probably 
# will not work. 

# some time later update master, e.g. rsync master from upstream mirror 
# mutates master in some way, changes/adds/removes remove files including 
# binaries 
echo -n $'\001\002' > master/new.bin 
rm master/gone.bin 

# generate rsync batch that can be used to ``patch`` copy.0 
# to become identical to master 
rsync -a --delete --itemize-changes --only-write-batch=copy.0.batch \ 
    master/ copy.0/ 
# now the file copy.0.batch contains only the deltas to be applied 

# transfer the batch file to where it needs to be applied 

# apply the batch to copy.0 
rsync -a --delete --itemize-changes --read-batch=copy.0.batch copy.0/ 

これは、欠失および他の多くのものの世話、おそらく許可を取ります、timestampsなどがありますが、ハードリンクはハードリンクとして処理されない可能性があり、別のリンクされていないファイルとして作成される可能性があります。

関連する問題