比較したい2本の大きな木があります。ツリー内の一部のファイルは、一方のファイルの最後に改行があり、もう一方のファイルにこの改行がないという理由だけで異なります。私はこの事実を無視したい。私はdiff
このように呼んでみました:
diff --ignore-all-space -r <dir1> <dir2>
そして、これは機能しています。私の問題は、他の違い(スペース関連)も無視することです。これは重要な場合があります。
要約すると、EOFの改行を無視したいだけです。これはで可能diff
ですか?
基本的に、末尾のバイトを条件付きで無視して、2つのファイルを比較する必要があります。これを行うための「diff」オプションはありませんが、実行できる方法はいくつかあります(たとえば、hex diffも思い浮かびます)。
'diff'を使用するには、基本的に、ファイルの最後に改行がないファイルを変更してから、比較する必要があります。変更されたファイルを使用して一時ディレクトリを作成することも、少しのスクリプトを使用してメモリ内で作成することもできます。(どちらが優先されるかは、設定、ファイルサイズ、ファイル数によって異なります...)
たとえば、次のようにファイルの内容sed -i
を変更し(インプレースで変更するために使用します。これはstdoutに出力されます)、改行がない場合は改行を追加します(または、改行が既にある場合はファイルを変更しないでください)。
sed -e '$a\' file1.txt
そして、「diff」構文を確認するだけです(trueを返すことはそれらが同じであることを意味し、falseは異なることを意味します):
$ diff a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
2c2
< eof
---
> eof
\ No newline at end of file
** are different
空白のみが異なることを確認します。
$ diff --ignore-all-space a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
** are same
bashでは、「sed」を使用して、ファイルの内容が「diff」に渡されるときにファイルの内容を操作できます(元のファイルは変更されません)。
$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
&& echo '** are same' || echo '** are different'
** are same
これで、エミュレートdiff -r
してディレクトリを再帰的に比較するだけです。もし、ディレクトリを比較a
し、b
内のすべてのファイルのために、その後、a
(例えば、a/dir1/dir2/file.txt
内のファイルへの)を導出パスb
(例えば、b/dir1/dir2/file.txt
)と比較します。
$ for f in $( find a -type f )
> do
> diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done
もう少し冗長なバージョン:
$ for f in $( find a -type f )
> do
> f1=$f
> f2=b/${f#*/}
> echo "compare: $f1 $f2"
> diff <(sed -e '$a\' $f1) <(sed -e '$a\' $f2) \
> && echo '** are same' || echo '** are different'
> done && echo '** all are same' || echo '** all are different'
compare: a/file1.txt b/file1.txt
** are same
compare: a/file2.txt b/file2.txt
** are same
** all are same
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加