С 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