Eu acho que por 'solução mais curta' você quer dizer linha mais curta, você não pode encurtar sua lista muito longa, certo?
Sugiro que você coloque todas as palavras em um arquivo e faça uso da opção -f grep. Então a solução abaixo faz uso da opção -o que fornece as únicas partes correspondentes. Isso resulta na lista de todas as palavras correspondentes em um arquivo. Ordenar, em seguida, uniqing que lista se corresponde a lista de padrões significa exatamente que o arquivo tem todos eles. wc -l
conta linhas.
find -name '*model.txt' | while read f; do [[ "$(grep -o -w -f patterns $f| sort -u|wc -l)" -eq "$(cat patterns | wc -l)" ]] && echo $f; done
padrões é o nome do arquivo que contém suas palavras de pesquisa:
#cat patterns
ből
ből
dének
jeként
jé
....
Note também a opção -w do grep, que garante correspondência apenas com palavras inteiras. Caso contrário, o cálculo pode dar errado para substirng palavras como alegria e alegria ful
É claro que você pode ter um visual mais agradável do onliner, se isso for importante para você
Atualizar Certifique-se de que o arquivo padrão não tenha linhas vazias.
Atualização2Certifique-sedequeoseuarquivodepadrõesnãotemduplicatas-issoestragaráafesta
Atualização3
Paraterumcontadordeocorrênciasnafrentedonomedoarquivo:
find-name'*model.txt'|whilereadf;do[["$(grep -o -w -f patterns $f| tee /tmp/$f |sort -u|wc -l)" -eq "$(cat patterns | wc -l)" ]] && echo $(cat /tmp/$f|wc -l) $f ; rm /tmp/$f; done
A idéia é salvar todas as correspondências em tempo real em um arquivo temporário e contá-las antes de classificá-las / uni-las. Limpe o arquivo tmp apenas para manter boas maneiras.