З 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