First I guess this will open every file and close it before opening the second file to search for the word? is this efficient, if not is there a way more efficient?
Sim, o grep será aberto e pesquisará todos os arquivos por vez. Na maioria das configurações, essa é a maneira mais eficiente. A menos que o regexp seja extremamente complexo, essa tarefa está firmemente vinculada à E / S, ou seja, o gargalo de desempenho está sendo lido no disco e sua CPU não será sobrecarregada.
Em algumas configurações, a E / S pode ser paralelizada; por exemplo, se você tiver uma configuração RAID-1 ou RAID-0, os dois (ou mais) componentes da matriz RAID poderão ser lidos em paralelo, o que economizará tempo. Se você tem essa configuração, você pode chamar uma ferramenta como GNU Parallel para chamar duas instâncias do grep (veja o manual para exemplos de comando). Na maioria das configurações, chamar duas instâncias de grep paralelamente será mais lento, porque as cabeças de disco continuarão alternando entre os arquivos acessados pelas duas instâncias (com SSD, chamar duas instâncias em paralelo normalmente não causará uma lentidão maior, mas ganhou seja mais rápido também.
Se você passar mais de um arquivo na linha de comando, o grep mostrará o nome do arquivo antes de cada correspondência, no formato
path/to/file:line containing a match
Se você estiver usando um padrão curinga ou alguma outra forma de gerar nomes de arquivo e quiser exibir o nome do arquivo mesmo no caso de haver um único arquivo correspondente, diga ao grep para pesquisar o vazio dispositivo nulo também.
grep REGEX /dev/null *.txt
( grep -H REGEX *.txt
é semelhante, mas usar /dev/null
tem o benefício adicional de funcionar perfeitamente, mesmo se a lista de arquivos correspondentes estiver vazia, enquanto grep -H REGEX
lê a entrada padrão.)