xargs
espera a entrada em um formato que nenhum outro comando produz, por isso é difícil usar de forma eficaz. O que está errado aqui é que você tem um arquivo cujo nome deve ser citado na entrada para xargs
(provavelmente contendo um '
).
Se o seu grep suportar a opção -r
ou -R
para pesquisa recursiva, use-a.
grep -r word .
Caso contrário, use o -exec
primary de find
. Essa é a maneira usual de obter o mesmo efeito que xargs
, exceto sem restrições em nomes de arquivos. Versões razoavelmente recentes de find
permitem agrupar vários arquivos em uma única chamada para o comando auxiliar. Passar /dev/null
para grep
garante que ele mostrará o nome do arquivo na frente de cada correspondência, mesmo que seja chamado em um único arquivo.
find . -type f -exec grep word /dev/null {} +
Versões antigas de find
(em sistemas mais antigos ou OpenBSD, ou utilitários reduzidos como o BusyBox) só podem chamar o comando auxiliar em um arquivo de cada vez.
find . -type f -exec grep word /dev/null {} \;
Algumas versões de find
e xargs
têm extensões que permitem que elas se comuniquem corretamente, usando caracteres nulos para separar os nomes de arquivos, de modo que nenhuma citação seja necessária. Atualmente, apenas o OpenBSD possui esse recurso sem ter -exec … {} +
.
find . -type f -print0 | xargs -0 grep word /dev/null