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
-0octaldé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 $het $nvariables, 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::Mmapmodule 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