Aqui está uma maneira segura:
grep -lrIZ foo . | xargs -0 rm -f --
-
-l
imprime os nomes dos arquivos que correspondem ao padrão de pesquisa. -
-r
realiza uma pesquisa recursiva para o padrãofoo
no diretório fornecido.
. Se isso não funcionar, tente-R
. -
-I
(capitali
) faz com que arquivos binários, como PDFs, sejam ignorados. -
-Z
garante que os nomes dos arquivos sejam zero- (isto é, nul-) terminados, de modo que um nome contendo espaço em branco não seja interpretado de maneira errada (ou seja, como vários nomes em vez de um). -
xargs -0
alimenta os nomes dos arquivos degrep
arm -f
, separando palavras por zero (nul) bytes (lembre-se da opção-Z
degrep
). -
--
é frequentemente esquecido, mas é muito importante marcar o final das opções e permitir a remoção de arquivos cujos nomes começam com-
.
Se você quiser ver quais arquivos estão prestes a serem excluídos, basta remover a parte | xargs -0 rm -f --
e deixar a opção Z
em grep
.
Outro usuário sugeriu algo como o seguinte, que você não deve executar porque não é seguro:
files='grep foo * | cut -d: -f1'
rm -f $files # unsafe, do not run it!
Se eu tiver arquivos ImportantStuff
que não desejo excluir e obsolete ImportantStuff
contendo foo
, perco ImportantStuff
(e não obsolete ImportantStuff
!) quando eu corro este comando, porque $files
é quebrado em espaços quando é interpretado. É perigoso colocar uma lista de nomes de arquivos em uma variável de shell escalar dessa maneira.