Quero encontrar todos os arquivos que contenham as palavras “Quem”, “O quê”, “Por que”, “Como”, “Quando”. Todas as palavras, em qualquer ordem. Insensível a maiúsculas e minúsculas
Tentei:
grep -rl --include='*.adoc' "Who" . | xargs grep -l "What" | xargs grep -l "Why" | xargs grep -l "How" | xargs grep -l "When"
Está dando erro do tipo:
grep: Walkthrough/datatable/extras/Scroller/media/data/2500.adoc: No such file or directory
O problema que você está enfrentando é que alguns dos seus nomes de arquivos contêm espaços.
xargs
irá dividir isso em vários "nomes de arquivos".Adicione a
-0
opção paraxargs
dividi-los em NULs em vez de espaços em branco, e a opção--null
ou para a linha de comando para fazer com que use NULs em vez de novas linhas. (mas omita o final se quiser ler a saída...). Então juntando tudo:-Z
grep
--null
grep
Como alternativa, elimine os espaços em branco e outros caracteres especiais do shell dos nomes de arquivos.
Caso contrário, sua solução está basicamente correta, embora a resposta de @James esteja correta, pois você precisa da
-i
opção que não diferencia maiúsculas de minúsculas.Usando
find
e GNU awk no modo slurp para processar arquivos inteiros como registros únicos e limites de palavras\<
, equivalente à opção /\>
do grep :-w
--word-regexp
embora isso pareça ser uma ordem de magnitude mais lenta do que passar por vários greps - acho que o armazenamento em cache significa que há muito pouca sobrecarga no grep do mesmo arquivo várias vezes.