回答:
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つのファイル間のすべての違いを示すために、複雑なアルゴリズムを使用しようとしているテキストユーティリティです。
システムにcmpGNUからのコマンドがある場合、diffutils1つのオプションは
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
cmpGNU cmpだったというだけで、それがGNU に固有のものであることを意味するつもりはありませんでした。明確にするために文を追加しました。
file1、もう1つに名前が付けられているとしfile12ます。(第2ファイルの名前はどのような場合、またはさらに悪いEOF on file1?)確実に使用して、これを解決するcmp...おそらくCで明らかに5行のプログラムを書くよりもはるかに多くのトラブルです
cmpは非常に厳しく制限されているため、かなり堅牢にするのはそれほど難しくありません。-xオプションon grepを使用して行全体を一致させると、ほとんどの特殊なケース(ファイル名の改行など)以外のすべてが処理されます。
cmpより良いのか説明していただけますdiffか?