Avec 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
définit le délimiteur d'enregistrement. Lorsque ce nombre octal est supérieur à 0377 (la valeur d'octet maximale), cela signifie qu'il n'y a pas de délimiteur, c'est équivalent à faire $/ = undef
. Dans ce cas, <>
renvoie le contenu complet d'un seul fichier, c'est le mode slurp .
Une fois que nous avons le contenu des fichiers en deux $h
et $n
variables, nous pouvons utiliser index()
pour déterminer si l'un se trouve dans l'autre.
Cela signifie cependant que tous les fichiers sont stockés en mémoire, ce qui signifie que cette méthode ne fonctionnera pas pour les fichiers très volumineux.
Pour les fichiers mmappables (inclut généralement les fichiers standard et les fichiers les plus recherchés comme les périphériques de bloc), cela peut être contourné en utilisant mmap()
les fichiers, comme avec le Sys::Mmap
module 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