Pode pelo menos ser simplificado para:
set -f # needed if you're using the split+glob operator and don't want the
# glob part
for key in $(cat /tmp/listOfKeys.txt); do
grep -riFqe "$key" . ||
printf '%s\n' "$key has no occurrence"
done
O qual pararia de pesquisar após a primeira ocorrência do key
e não consideraria a chave como uma expressão regular (ou possível opção para grep
).
Para evitar a necessidade de ler arquivos várias vezes, e supondo que sua lista de chaves seja uma chave por linha (ao contrário de espaço / tabulação / nova linha separada no código acima), você poderia fazer com ferramentas GNU:
find . -type f -size +0 -printf '%pfind . -type f -size +0 -exec printf '%sset -f # needed if you're using the split+glob operator and don't want the
# glob part
for key in $(cat /tmp/listOfKeys.txt); do
grep -riFqe "$key" . ||
printf '%s\n' "$key has no occurrence"
done
' {} + | awk '
step == 1 {ARGV[ARGC++] = $0; next}
step == 2 {a[tolower($0)]; n++; next}
{
l = tolower($0)
for (i in a) if (index(l, i)) {
delete a[i]
if (!--n) exit
}
}
END {
for (i in a) print i, "has no occurrence"
}' step=1 RS='find . -type f -size +0 -printf '%pfind . -type f -size +0 -exec printf '%s%pre%' {} + | awk '
step == 1 {ARGV[ARGC++] = $0; next}
step == 2 {a[tolower($0)]; n++; next}
{
l = tolower($0)
for (i in a) if (index(l, i)) {
delete a[i]
if (!--n) exit
}
}
END {
for (i in a) print i, "has no occurrence"
}' step=1 RS='%pre%' - step=2 RS='\n' /tmp/listOfKeys.txt step=3
' | awk '
ARGIND == 2 {ARGV[ARGC++] = $0; next}
ARGIND == 4 {a[tolower($0)]; n++; next}
{
l = tolower($0)
for (i in a) if (index(l, i)) {
delete a[i]
if (!--n) exit
}
}
END {
for (i in a) print i, "has no occurrence"
}' RS='%pre%' - RS='\n' /tmp/listOfKeys.txt
' - step=2 RS='\n' /tmp/listOfKeys.txt step=3
' | awk '
ARGIND == 2 {ARGV[ARGC++] = $0; next}
ARGIND == 4 {a[tolower($0)]; n++; next}
{
l = tolower($0)
for (i in a) if (index(l, i)) {
delete a[i]
if (!--n) exit
}
}
END {
for (i in a) print i, "has no occurrence"
}' RS='%pre%' - RS='\n' /tmp/listOfKeys.txt
Ele é otimizado porque irá parar de procurar por key
assim que for visto e parará assim que todas as chaves forem encontradas e lerá os arquivos apenas uma vez.
Ele assume que as chaves são exclusivas em listOfKeys.txt
. Ele irá mostrar as chaves em letras minúsculas.
Os GNUisms acima são -printf '%p
, ARGIND
'awk
e a capacidade de %code% de manipular registros delimitados por NUL. Os dois primeiros podem ser abordados com:
O terceiro pode ser tratado com truques como este , mas provavelmente não vale a pena o esforço. Veja a solução de E / S de Descalços para uma maneira de contornar o problema completamente.