で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::Mmap
perlモジュールのようにファイルを使用して回避できます。
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