Eu quero excluir todos os arquivos que contêm a string foo
. Como posso fazer isso usando o bash no Linux?
linux
command-line
bash
find
Kitsos
fonte
fonte
foo
(por exemplomyfoo.jpg
) ou arquivos que contenham a sequência de bytesfoo
(que podem incluir arquivos binários que por acaso contenham essa sequência de bytes)?Respostas:
Aqui está uma maneira segura:
-l
imprime nomes de arquivos que correspondem ao padrão de pesquisa.-r
realiza uma pesquisa recursiva para o padrãofoo
no diretório especificado.
. 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 zerados (ou seja, nul-), para que um nome contendo espaço em branco não seja interpretado da maneira errada (ou seja, como vários nomes em vez de um).xargs -0
alimenta os nomes dos arquivos degrep
pararm -f
, separando as palavras por zero (nul) bytes (lembre-se da-Z
opção 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ê deseja ver quais arquivos estão prestes a serem excluídos, remova a
| xargs -0 rm -f --
peça e deixe aZ
opção paragrep
.Outro usuário sugeriu algo como o seguinte, que você não deve executar porque não é seguro:
Se eu tiver arquivos
ImportantStuff
que não desejo excluir eobsolete ImportantStuff
conterfoo
, percoImportantStuff
(e nãoobsolete ImportantStuff
!) Quando executo esse comando, porque$files
é desmembrado em espaços quando é interpretado. É perigoso colocar uma lista de nomes de arquivos em uma variável de shell escalar dessa maneira.fonte
Isso recursivamente procura por arquivos que contenham
foo
. O segundo-exec
só é executado se o primeiroexec
sair com êxito, ou seja, segrep
corresponder. Dryrun e remova oecho
se a saída parece correta.Ou alternativamente
e
como sugerido por Lekensteyn.
fonte
find -type f -exec grep -q 'foo' {} \; -delete
(as aspas{}
são redundantes,find
também é possível excluir arquivos.). Observe quegrep
aceita uma expressão regular. Se você deseja procurarfoo.bar
, escape ou passe a-F
opção de tratar o padrão como literal.-exec echo rm "{}" \;
e não-delete
?-delete
. É mais fácil demonstrar com o segundo-exec
e eco no lugar.-print
(ou-ls
para mais verbosidade) que-exec echo rm "{}" \'
. Não há necessidade de utilitários externos.Eu faria o que Adrian diz,
Mas eu adicionaria limites de palavras ao redor para não excluir acidentalmente arquivos que contenham "comida" (a menos que esteja excluindo tudo o que contém comida é o que você deseja).
agudamente, redirecionaria a saída antes de excluir para poder revisar antes de excluir:
fonte