web-dev-qa-db-ja.com

すべてのバイナリファイルを無視して、ディレクトリを再帰的にdiffします

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

私が理解している限り、diffには「バイナリファイルを無視」モードはありませんが、正規表現withinファイルを無視するignore引数があります。拡張子に関係なく、バイナリファイルを無視するためにそこに何を書くべきかわかりません。

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

diff -rq dir1 dir2
71
Zéychin

grep -Igrep --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
32
jon

不正行為の一種ですが、ここに私が使用したものがあります:

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

これはdir1とdir2を再帰的に比較し、sedはバイナリファイル(「Binary files」で始まる)の行を削除してから、出力ファイルにリダイレクトします。

64

私はこの(古い)質問に似たものを探しに来ました(デフォルトのApacheインストールと比較して、レガシー実動サーバー上の構成ファイル)。コメントでの@fearlesstostの提案に続いて、gitは十分に軽量で高速であるため、おそらく上記の提案のどれよりも簡単です。 コピー version1を新しいディレクトリに。それから:

git init
git add .
git commit -m 'Version 1'

このディレクトリのバージョン1からすべてのファイルを削除し、バージョン2をディレクトリにコピーします。今やる:

git add .
git commit -m 'Version 2'
git show

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

11

プロジェクトのバイナリファイルの名前が特定のパターン(* .o、*。so、...)に従っている場合、通常どおり、それらのパターンをファイルに入れて、-X(ハイフンXを使用して指定できます) )。

「除外ファイル」の内容* .o * .so * .git

diff -X exclude_file -r . other_tree > my_diff_file
1
Mohan S Nayaka

findfileコマンドの組み合わせを使用します。これには、ディレクトリ内のfileコマンドの出力について調査する必要があります。以下では、比較したいファイルが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
0
Fredrik Pihl

さて、大まかな種類のチェックとして、/\0 /に一致するファイルを無視できます。

0
Troy