find - exec rm vs -delete

217

Estou tentando entender a diferença entre esses dois comandos:

sudo find / -name .DS_Store -delete

e

sudo find / -name ".DS_Store"  -exec rm {} \;

Percebi que o método exec é o preferido. Por quê? Qual deles é mais seguro / mais rápido / melhor? Eu usei ambos no meu Macbook e tudo parece funcionar bem.

    
por Onion 13.11.2014 / 19:50

3 respostas

208

-delete terá um desempenho melhor porque não precisa gerar um processo externo para cada arquivo correspondente.

É possível que você veja -exec rm {} \; frequentemente recomendado porque -delete não existe em todas as versões de find . Não posso verificar agora, mas tenho certeza que usei um find sem ele.

Ambos os métodos devem ser "seguros".

EDITAR por comentário de @doitmyway: certifique-se de combinar no nome e então excluir, e não o contrário (excluir, depois combinar). Caso contrário, todos os arquivos serão excluídos, se corresponderem ou não . Ou seja, NÃO faça isso: find / -delete -name .DS_Store .

Um método comum para evitar a sobrecarga de gerar um processo externo para cada arquivo correspondente é:

find / -name .DS_Store -print0 | xargs -0 rm

(mas note que também há um problema de portabilidade: nem todas as versões do find têm -print0 !)

    
por 13.11.2014 / 19:55
20

Supondo que .DS_Store represente arquivos e não diretórios, a maneira mais portátil e mais rápida de fazer isso seria:

sudo find / -name .DS_Store -exec rm {} +

O único risco é que sudo não esteja disponível, mas é bastante baixo hoje em dia.

-delete exige que o GNU encontre o que não está sempre presente.

A terminação do comando + em vez de \; otimiza muito a cláusula exec , não executando o comando rm para cada .DS_Store presente no sistema de arquivos.

    
por 04.04.2015 / 11:24
12

Para uma máquina como o seu macbook, você não encontrará muita diferença no desempenho entre os dois comandos. No entanto, se você observar a versão -exec, verá uma diferença sutil:

sudo find / -iname ".file-to-delete"  -exec rm {} \;

Isso significa que você encontrará todos os arquivos com o nome ".file-to-delete". No entanto, essa pesquisa pode retornar alguns falsos positivos indesejados. Ao fazer algo com o sudo, você deve ser um pouco mais cuidadoso. A vantagem de usar -exec rm {} é que você pode passar argumentos para rm assim:

sudo find / -iname "*~"  -exec rm -i {} \;

Neste exemplo, quero remover os arquivos de backup que o emacs faz. No entanto, esse til pode estar em algum arquivo obscuro que eu não conheço e poderia ser importante. Além disso, quero confirmar a exclusão. Então eu coloquei a opção '-i' no comando rm. Isso me dará uma exclusão interativa.

Além disso, você pode refinar o uso de rm para excluir diretórios e arquivos:

find /usr/local/share/ -iname "useless" -exec rm -r {} \;

Resumidamente, o -exec fornece um pouco mais de controle sobre o comando real que remove o item encontrado. A vantagem é que você usa uma ferramenta para encontrar os arquivos, outra ferramenta para removê-los. Além disso, nem todas as versões do utilitário find têm a opção -delete. Então é melhor usar cada ferramenta para seu trabalho adequado. Esta é a filosofia unix - uma ferramenta, um trabalho, use-os juntos para fazer o que você precisa fazer.

    
por 04.04.2015 / 09:17

Tags