Mit 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
Definiert den Datensatzbegrenzer. Wenn diese Oktalzahl größer als 0377 (der maximale Bytewert) ist, bedeutet dies, dass es keinen Begrenzer gibt. Dies entspricht dem Vorgang $/ = undef
. In diesem Fall wird <>
der vollständige Inhalt einer einzelnen Datei zurückgegeben. Dies ist der Slurp-Modus .
Sobald wir den Inhalt der Dateien in zwei $h
und $n
Variablen haben, können wir index()
feststellen, ob eine in der anderen gefunden wird.
Dies bedeutet jedoch, dass die gesamten Dateien im Speicher abgelegt werden, was bedeutet, dass die Methode bei sehr großen Dateien nicht funktioniert.
Für mmappable-Dateien (enthält normalerweise reguläre Dateien und am meisten durchsuchbare Dateien wie Block-Geräte), die durch Verwendung mmap()
der Dateien wie mit dem Sys::Mmap
Perl-Modul umgangen werden können:
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