Con 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 el delimitador de registro. Cuando ese número octal es mayor que 0377 (el valor de byte máximo), eso significa que no hay delimitador, es equivalente a hacerlo $/ = undef
. En ese caso, <>
devuelve el contenido completo de un solo archivo, ese es el modo slurp .
Una vez que tenemos el contenido de los archivos en dos $h
y $n
variables, podemos usar index()
para determinar si uno se encuentra en el otro.
Sin embargo, eso significa que todos los archivos se almacenan en la memoria, lo que significa que el método no funcionará para archivos muy grandes.
Para archivos mmappables (generalmente incluye archivos normales y la mayoría de los archivos buscables, como dispositivos de bloque), se puede solucionar usando mmap()
los archivos, como con el 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