З 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визначає роздільник запису. Коли число восьмериків більше 0377 (максимальне значення байта), це означає, що немає роздільника, це рівнозначно виконанню $/ = undef. У такому випадку <>повертається повний вміст одного файлу, ось режим "slurp" .
Як тільки ми вмістимо файли у двох $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