Với 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
xác định dấu phân cách bản ghi. Khi số bát phân đó lớn hơn 0377 (giá trị byte tối đa), điều đó có nghĩa là không có dấu phân cách, nó tương đương với việc thực hiện $/ = undef
. Trong trường hợp đó, <>
trả về toàn bộ nội dung của một tệp, đó là chế độ nhếch nhác .
Khi chúng tôi có nội dung của các tệp trong hai $h
và $n
biến, chúng tôi có thể sử dụng index()
để xác định xem cái này có được tìm thấy trong cái kia không.
Tuy nhiên, điều đó có nghĩa là toàn bộ tệp được lưu trữ trong bộ nhớ, điều đó có nghĩa là phương thức đó sẽ không hoạt động đối với các tệp rất lớn.
Đối với các tệp mmappable (thường bao gồm các tệp thông thường và hầu hết các tệp có thể tìm kiếm như thiết bị khối), có thể được xử lý bằng cách sử dụng mmap()
trên các tệp, như với Sys::Mmap
mô-đun 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