2011-07-15 18 views
50

Fedora Constantineボックスで作業しています。私はdiff 2つのディレクトリを再帰的にソースの変更を確認するために探しています。プロジェクトのセットアップのために(私のプロジェクト前に約束しました!sigh)、このディレクトリにはソースとバイナリの両方と大きなバイナリデータセットが含まれています。 diffingは最終的にこれらのディレクトリで動作しますが、私がバイナリファイルを無視できるのであれば、おそらく20秒かかります。ディレクトリを再帰的に差分し、すべてのバイナリファイルを無視します。

私の知る限り、diffは 'バイナリファイルを無視する'モードを持っていませんが、内の正規表現を無視するignore引数を持っています。私はバイナリファイルを無視するために、拡張子にかかわらずそこに書き込むべきものを知らない。

次のコマンドを使用していますが、バイナリファイルを無視しません。誰もがこれを行うには、このコマンドを変更する方法を知っていますか?

デフ-rq DIR1 DIR2

+2

内容ではなく、 'diff'の' cmp'を使用してみてください、バイナリファイルを無視することはありませんが、より高速でなければなりません –

+0

チップをありがとう。 –

+1

eek。これはソース管理のポスターの子の正当性です。あなたがそれを使用していない場合は、あなたはすべきです。決定があなたの手にない場合、あなたは情熱的に主張するべきです。あなたの問題は適切なgitの設定で消えてしまうでしょう... – fearlesstost

答えて

31

バイナリファイルを並べ替えるフィルタとして、grep -I(これはgrep --binary-files=without-matchに相当)を使用することがあります。

dir1='folder-1' 
dir2='folder-2' 
IFS=$'\n' 
for file in $(grep -Ilsr -m 1 '.' "$dir1"); do 
    diff -q "$file" "${file/${dir1}/${dir2}}" 
done 
+0

これは非常に有望です。私はこれをチェックして、それが動くかどうかを知ってもらいます/それがうまくいけば答えとして受け入れましょう! –

+0

これははるかに迅速に私のために働いた。 ありがとうございます。 –

+2

誰でも 'IFS = $ '\ n"の目的を知っていますか? – Zubin

0

まあ、チェックの粗製の一種として、あなたは/ \ 0 /に一致するファイルを無視することができます。

+1

問題は、diffがファイルを無視することをサポートしているように見えないことです。 –

+1

'-x'フラグは、ファイルを無視するために使用できます。 – xdhmoore

0

findの組み合わせとfileコマンドを使用します。これには、ディレクトリ内のfileコマンドの出力に関するいくつかの調査を行う必要があります。私はdiffしたいファイルがasciiとして報告されていると仮定しています。または、grep -vを使用してバイナリファイルをフィルタします。あなたはおそらく、巨大なバイナリの名前を知っているハッシュ配列にそれらを配置し、ファイルをハッシュしていないときにのみ、差分を行うので

#!/bin/bash 

dir1=/path/to/first/folder 
dir2=/path/to/second/folder 

cd $dir1 
files=$(find . -type f -print | xargs file | grep ASCII | cut -d: -f1) 

for i in $files; 
do 
    echo diffing $i ---- $dir2/$i 
    diff -q $i $dir2/$i 
done 

、このような何か:

#!/bin/bash 

dir1=/path/to/first/directory 
dir2=/path/to/second/directory 

content_dir1=$(mktemp) 
content_dir2=$(mktemp) 

$(cd $dir1 && find . -type f -print > $content_dir1) 
$(cd $dir2 && find . -type f -print > $content_dir2) 

echo Files that only exist in one of the paths 
echo ----------------------------------------- 
diff $content_dir1 $content_dir2  

#Files 2 Ignore 
declare -A F2I 
F2I=([sqlite3]=1 [binfile2]=1) 

while read f; 
do 
    b=$(basename $f) 
    if ! [[ ${F2I[$b]} ]]; then 
     diff $dir1/$f $dir2/$f 
    fi 
done < $content_dir1 
50

ここでの不正行為のようなものが、私は使用したものです:この再帰的(「バイナリファイル」で始まる)バイナリファイルの行を削除しセッド、DIR2にDIR1を比較

diff -r dir1/ dir2/ | sed '/Binary\ files\ /d' >outputfile 

、それはOUTPUTFILEにリダイレクトされます。

+4

+1で与えられた値で分割して配列を作成するのに使用されます; – Nippey

+0

ありがとう!また、すべてのXMLファイルを除外する方法は? – Serg

+5

@Serg '-x'フラグを使ってファイルを除外することができます。 'diff -r -x '* .xml' dir1 dir2'を試してください。さらに詳しい情報は' man diff'を参照してください。 – xdhmoore

10

私はこの(古い)質問に似たもの(デフォルトのApacheインストールと比較して従来のプロダクションサーバーの設定ファイル)を探しました。コメント内の@ fearlesstostの提案に続いて、gitは十分に軽量で速く、上記の提案よりも簡単です。 version1を新しいディレクトリにコピーします。次に、このディレクトリのバージョン1からすべてのファイルを削除し、バージョン2をディレクトリにコピーします。今すぐ:

これは、最初のコミットと2番目の間のすべての違いのGitのバージョンを表示します。バイナリファイルの場合、それらは異なるとだけ言います。あるいは、各バージョンのブランチを作成し、gitのマージツールを使ってマージしようとすることもできます。

+2

または単に 'git diff folder1 folder2' ... –

0

プロジェクト内のバイナリファイルの名前が特定のパターン(* .o、* .so、...)、通常はそういうパターンをファイルに入れ、-X(ハイフンX)を使ってパターンを指定することができます。私の "ファイルを除外する" * .oの * .soは * .git

diff -X exclude_file -r . other_tree > my_diff_file 
+0

それは-x NOT -Xです。 –

関連する問題