Z 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
definiuje ogranicznik rekordu. Kiedy ta liczba ósemkowa jest większa niż 0377 (maksymalna wartość bajtu), oznacza to, że nie ma separatora, jest to równoważne z działaniem $/ = undef
. W takim przypadku <>
zwraca pełną zawartość jednego pliku, to jest tryb slurp .
Gdy mamy zawartość plików na dwie części $h
i $n
zmienne, możemy użyć, index()
aby ustalić, czy jeden znajduje się w drugim.
Oznacza to jednak, że całe pliki są przechowywane w pamięci, co oznacza, że metoda nie będzie działać w przypadku bardzo dużych plików.
W przypadku plików mmappable (zwykle obejmuje zwykłe pliki i najbardziej widoczne pliki, takie jak urządzenia blokowe), które można obejść za pomocą mmap()
plików, takich jak Sys::Mmap
moduł perla:
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