file1がfile2のプレフィックスであるかどうかを確認する方法は?


13

サイズが124665と124858バイトの2つのファイルがあり、file1がfile2のプレフィックスかどうかを確認したい。

回答:


11

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

@StéphaneChazelasなぜここcmpより良いのか説明していただけますdiffか?
ジョセフR. 14年

7
のでcmpながら、それは、違いを見つけるとすぐに、単純なバイト比較へのバイト、およびリターンを行いdiff、あなたが気にしない2つのファイル間のすべての違いを示すために、複雑なアルゴリズムを使用しようとしているテキストユーティリティです。
ステファンシャゼル14年

12

システムにcmpGNUからのコマンドがある場合、diffutils1つのオプションは

cmp -n 124665 file1 file2

2つのファイルの最初の最大124665バイトを比較し、それらが異なる場合に報告する-または、より一般的に

cmp -n "$(wc -c < file1)" file1 file2

@StephaneChazelas私はここで自分自身を2番目に推測していますが$(stat -c %s file1)、バイト単位のサイズを提案する方が良いでしょうか?いwc、実際にオープンし、バイト数を取得するには、ファイル全体を処理しますか?
スチールドライバー14年

2
いいえ、ほとんどのwc実装はそのケースを最適化し、fstat()(または/およびlseek(SEEK_END))を実行するので、できるだけ効率的です。一方、それstat -cはGNU固有のものです。
ステファンシャゼル14年

1
GNU固有を要求する場合でも、GNU固有をcmp合理的に想定できますstat
バーマー14年

3

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も同様のことをしていると思いますが、チェックしていません。


1
cmpはGNU専用のコマンドではなく、そこから生まれたものでもありません。70年代前半にはすでにUnixの最初のバージョンでした。-nただし、このオプションはGNU固有です。
ステファンシャゼル14年

あなたができるcmp file1 file2 2>&1 | grep EOF on file1
デビッドZ 14年

@StéphaneChazelas:それは本当です。私が試した唯一のバージョンがcmpGNU cmpだったというだけで、それがGNU に固有のものであることを意味するつもりはありませんでした。明確にするために文を追加しました。
ネイト・エルドリッジ2014年

@DavidZ:はい、できますが、堅牢性はやや劣ります。ユーザーから提供された2つのファイルを使用してこれを行おうとしており、そのうちの1つに名前が付けられfile1、もう1つに名前が付けられているとしfile12ます。(第2ファイルの名前はどのような場合、またはさらに悪いEOF on file1?)確実に使用して、これを解決するcmp...おそらくCで明らかに5行のプログラムを書くよりもはるかに多くのトラブルです
ネイト・エルドリッジ

ただし、Cプログラムが実用的でない場合もあります。の出力cmpは非常に厳しく制限されているため、かなり堅牢にするのはそれほど難しくありません。-xオプションon grepを使用して行全体を一致させると、ほとんどの特殊なケース(ファイル名の改行など)以外のすべてが処理されます。
デビッドZ 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.