でperl:
if perl -0777 -e '$n = <>; $h = <>; exit(index($h,$n)<0)' needle.txt haystack.txt
then echo needle.txt is found in haystack.txt
fi
-0octalレコード区切り文字を定義します。その8進数が0377(最大バイト値)よりも大きい場合、これは区切り文字がないことを意味し$/ = undefます。その場合、<>単一ファイルの完全なコンテンツ、つまり丸lurみモードが返されます。
我々は2内のファイルの内容を持っていたら$hと$n変数を、我々は使用することができindex()、一方が他方に発見されたかどうかを判断します。
ただし、これはファイル全体がメモリに保存されることを意味します。つまり、この方法は非常に大きなファイルでは機能しません。
mmappableファイル(通常は通常のファイルとブロックデバイスのようなほとんどのシーク可能なファイルが含まれます)の場合はmmap()、Sys::Mmapperlモジュールのようにファイルを使用して回避できます。
if
perl -MSys::Mmap -le '
open N, "<", $ARGV[0] || die "$ARGV[0]: $!";
open H, "<", $ARGV[1] || die "$ARGV[1]: $!";
mmap($n, 0, PROT_READ, MAP_SHARED, N);
mmap($h, 0, PROT_READ, MAP_SHARED, H);
exit (index($h, $n) < 0)' needle.txt haystack.txt
then
echo needle.txt is found in haystack.txt
fi