Fedora Constantineボックスの作業。ソースの変更をチェックするために、diff
の2つのディレクトリを再帰的に探しています。プロジェクトのセットアップ(前述のプロジェクトとの私自身の関与の前に!sigh)により、ディレクトリにはソースとバイナリの両方が含まれ、大きなバイナリデータセット。最終的に差分はこれらのディレクトリで機能しますが、バイナリファイルを無視できる場合はおそらく20秒かかります。
私が理解している限り、diffには「バイナリファイルを無視」モードはありませんが、正規表現withinファイルを無視するignore引数があります。拡張子に関係なく、バイナリファイルを無視するためにそこに何を書くべきかわかりません。
次のコマンドを使用していますが、バイナリファイルは無視されません。これを行うためにこのコマンドを変更する方法を知っていますか?
diff -rq dir1 dir2
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
不正行為の一種ですが、ここに私が使用したものがあります:
diff -r dir1/ dir2/ | sed '/Binary\ files\ /d' >outputfile
これはdir1とdir2を再帰的に比較し、sedはバイナリファイル(「Binary files」で始まる)の行を削除してから、出力ファイルにリダイレクトします。
私はこの(古い)質問に似たものを探しに来ました(デフォルトの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のマージツールを使用してそれらをマージすることもできます。
プロジェクトのバイナリファイルの名前が特定のパターン(* .o、*。so、...)に従っている場合、通常どおり、それらのパターンをファイルに入れて、-X(ハイフンXを使用して指定できます) )。
「除外ファイル」の内容* .o * .so * .git
diff -X exclude_file -r . other_tree > my_diff_file
find
とfile
コマンドの組み合わせを使用します。これには、ディレクトリ内の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 /に一致するファイルを無視できます。