Como usar o comando find para excluir arquivos correspondentes a um padrão?

17

Estou tentando escrever um comando bash que excluirá todos os arquivos correspondentes a um padrão específico - nesse caso, são todos os arquivos de log antigos do vmware que foram criados.

Eu tentei este comando:

find . -name vmware-*.log | xargs rm

No entanto, quando executo o comando, ele é bloqueado em todas as pastas que possuem espaços em seus nomes. Existe uma maneira de formatar o caminho do arquivo para que o xargs o passe para rm entre aspas ou escape corretamente?

Dan Monego
fonte
Postagens cruzadas: stackoverflow.com/questions/1590297/…
pausado até novo aviso.

Respostas:

20

Geralmente acho que usar a -execopção para findser mais fácil e menos confuso. Tente o seguinte:

find . -name vmware-*.log -exec rm -i {} \;

Tudo o que se -execsegue é considerado um comando para executar para cada resultado, até o ;, que é escapado aqui para que seja passado para find. O {}é substituído pelo nome do arquivo que findnormalmente seria impresso.

Depois de verificar se faz o que deseja, você pode remover o -i.

Jeff Snider
fonte
1
Além disso, se são apenas arquivos que você deseja excluir e não diretórios, você pode adicionar '' -type f '' ao comando find.
21139 JamesHannah
18

Se você possui o GNU, findpode usar a -deleteopção:

find . -name "vmware-*.log" -delete

Para usar xargse evitar o problema com espaços nos nomes de arquivos:

find . -name vmware-*.log -print0 | xargs -0 rm

No entanto, seus arquivos de log não devem ter espaços em seus nomes. É provável que os documentos de processamento de texto e os arquivos MP3 os tenham, mas você deve poder controlar os nomes dos seus arquivos de log.

Pausado até novo aviso.
fonte
Isso é legal. Eu não sabia disso.
9139 Jeff Snider
8

Você pode dizer findpara delimitar a lista de saída com NULLs e xargsreceber a mesma lista de entrada:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

Além disso, certifique-se de escapar da *barra invertida ou contendo vmware-*.logaspas simples, caso contrário, seu shell poderá tentar expandi-lo antes de passá-lo para find.

James Sneeringer
fonte
6

Não esqueça a -deleteopção de encontrar . Ele remove o arquivo sem erros com caracteres especiais ...

Dom
fonte