Com 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
define o delimitador de registro. Quando esse número octal é maior que 0377 (o valor máximo de bytes), significa que não há delimitador, é equivalente a fazer $/ = undef
. Nesse caso, <>
retorna o conteúdo completo de um único arquivo, que é o modo slurp .
Uma vez que tenhamos o conteúdo dos arquivos em dois $h
e $n
variáveis, podemos usar index()
para determinar se um é encontrado no outro.
Isso significa, no entanto, que os arquivos inteiros são armazenados na memória, o que significa que esse método não funcionará para arquivos muito grandes.
Para arquivos mmappable (geralmente inclui arquivos regulares e os arquivos mais procuráveis, como dispositivos de bloco), isso pode ser contornado usando mmap()
os arquivos, como no Sys::Mmap
módulo 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