回答:
file1
変数にのサイズがFILE1_SZ
あり、head
実装が(非標準)-c
オプションをサポートしているとします:
if head -c "$FILE1_SZ" file2 | cmp -s - file1; then
echo "file1 is a prefix of file2"
else
echo "file1 is not a prefix of file2"
fi
cmp
ながら、それは、違いを見つけるとすぐに、単純なバイト比較へのバイト、およびリターンを行いdiff
、あなたが気にしない2つのファイル間のすべての違いを示すために、複雑なアルゴリズムを使用しようとしているテキストユーティリティです。
システムにcmp
GNUからのコマンドがある場合、diffutils
1つのオプションは
cmp -n 124665 file1 file2
2つのファイルの最初の最大124665バイトを比較し、それらが異なる場合に報告する-または、より一般的に
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)
、バイト単位のサイズを提案する方が良いでしょうか?いwc
、実際にオープンし、バイト数を取得するには、ファイル全体を処理しますか?
wc
実装はそのケースを最適化し、fstat()
(または/およびlseek(SEEK_END)
)を実行するので、できるだけ効率的です。一方、それstat -c
はGNU固有のものです。
cmp
合理的に想定できますstat
。
GNU cmp
はより簡単な方法で問題を解決できます。
cmp file1 file2
4つの可能な出力があります(何らかのエラーを除く)。
出力なし:ファイルは同一です。
cmp: EOF on file1
:file1はfile2のプレフィックスです。
cmp: EOF on file2
:file2はfile1のプレフィックスです。
file1 file2 differ: byte NNN, line MMM
:どちらも他方の接頭辞ではありません。
残念ながら、これはスクリプトで使用するのは少し厄介です。これらのケースは終了コードで区別されていないようだからです。さらに、EOF on file1
メッセージはstderrにfile1 file2 differ
送られ、メッセージはstdoutに送られます。
私は他のバージョンでcmp
も同様のことをしていると思いますが、チェックしていません。
cmp
はGNU専用のコマンドではなく、そこから生まれたものでもありません。70年代前半にはすでにUnixの最初のバージョンでした。-n
ただし、このオプションはGNU固有です。
cmp file1 file2 2>&1 | grep EOF on file1
cmp
GNU cmp
だったというだけで、それがGNU に固有のものであることを意味するつもりはありませんでした。明確にするために文を追加しました。
file1
、もう1つに名前が付けられているとしfile12
ます。(第2ファイルの名前はどのような場合、またはさらに悪いEOF on file1
?)確実に使用して、これを解決するcmp
...おそらくCで明らかに5行のプログラムを書くよりもはるかに多くのトラブルです
cmp
は非常に厳しく制限されているため、かなり堅牢にするのはそれほど難しくありません。-x
オプションon grep
を使用して行全体を一致させると、ほとんどの特殊なケース(ファイル名の改行など)以外のすべてが処理されます。
cmp
より良いのか説明していただけますdiff
か?