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

17

Estou tentando escrever um comando bash que excluirá todos os arquivos que correspondam a um padrão específico - neste caso, são todos os arquivos de log antigos do VMware que foram construídos.

Eu tentei este comando:

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

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

    
por Dan Monego 19.10.2009 / 20:22

4 respostas

20

Geralmente, acho que usar a opção -exec para find é mais fácil e menos confusa. Tente isto:

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

Tudo após -exec é considerado um comando a ser executado para cada resultado, até o ; , que é escapado aqui para que seja transmitido para find . O {} é substituído pelo nome do arquivo que find normalmente imprimiria.

Depois de confirmar que você faz o que deseja, é possível remover o -i .

    
por 19.10.2009 / 20:30
18

Se você tem o GNU find , você pode usar a opção -delete :

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

Para usar xargs e evitar o problema com espaços em 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 arquivos MP3 os tenham, mas você deve conseguir controlar os nomes de seus arquivos de registro.

    
por 19.10.2009 / 21:07
8

Você pode dizer a find para delimitar a lista de saída com NULLs e xargs para receber sua lista de entrada da mesma forma:

$ 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 que você escape do * , seja com uma barra invertida, ou contendo o vmware-*.log entre aspas simples, caso contrário seu shell tentará expandi-lo antes de passá-lo para find .

    
por 19.10.2009 / 20:34
6

Não se esqueça da opção -delete do item encontrado. Remove o arquivo sem erro com caracteres especiais ...

    
por 19.10.2009 / 21:00