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
definisce il delimitatore del record. Quando quel numero ottale è maggiore di 0377 (il valore massimo di byte), significa che non c'è delimitatore, è equivalente a fare $/ = undef
. In tal caso, <>
restituisce l'intero contenuto di un singolo file, questa è la modalità slurp .
Una volta che abbiamo il contenuto dei file in due $h
e $n
variabili, possiamo usare index()
per determinare se uno si trova nell'altro.
Ciò significa tuttavia che tutti i file sono archiviati in memoria, il che significa che il metodo non funzionerà per file molto grandi.
Per i file mmappable (di solito include file regolari e file più ricercabili come i dispositivi a blocchi), che possono essere aggirati usando mmap()
i file, come con il Sys::Mmap
modulo 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