Estou tentando entender a diferença entre eles dois comandos:
sudo find / -name .DS_Store -delete
e
sudo find / -name ".DS_Store" -exec rm {} \;
Notei que o -exec ... {}
é o preferido. Por quê? Qual é o mais seguro / rápido / melhor? Usei ambos no meu Macbook e tudo parece funcionar bem.
Resposta
-delete
terá melhor desempenho porque não precisa gerar um processo externo para cada e 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 de que usei um find
sem ele.
B os dois métodos devem ser “seguros”.
EDITAR por comentário de @doitmyway: certifique-se de corresponder no nome e então deletar, não o contrário (deletar e então combinar). Caso contrário, todos os arquivos serão excluídos, sejam eles correspondentes ou não . Ou seja, NÃO faça o seguinte: 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 observe que também há um problema de portabilidade aqui: nem todas as versões de find têm -print0
!)
Comentários
Resposta
Supondo que .DS_Store
represente arquivos e não diretórios, a maneira mais portátil e rápida de fazer isso seria:
sudo find / -name .DS_Store -exec rm {} +
O único risco é sudo
não estar disponível, mas é bastante baixo hoje em dia.
O -delete
opção usada para exigir GNU find e ainda não é padrão em muitas outras find
implementações, portanto, nem sempre está disponível.
O término do comando +
em em vez de \;
otimiza altamente a cláusula exec
ao não executar o comando rm
para cada e cada .DS_Store
presente no sistema de arquivos.
Resposta
Para uma máquina como como seu macbook, você não encontrará muita diferença no desempenho entre os dois comandos. No entanto, se você olhar para 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 -deletar”. 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 como este:
sudo find / -iname "*~" -exec rm -i {} \;
Neste exemplo, quero remover os arquivos de backup que emacs faz. No entanto, esse til pode estar em algum arquivo obscuro que eu não conheço e pode ser importante. Além disso, quero confirmar a exclusão. Então, 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, bem como arquivos:
find /usr/local/share/ -iname "useless" -exec rm -r {} \;
Em resumo, o -exec fornece você tem um pouco mais de controle sobre o comando real que remove o item encontrado.A vantagem é que você usa uma ferramenta para localizar os arquivos, outra ferramenta para removê-los.Além disso, nem todas as versões do utilitário find possuem a opção -delete. Portanto, é 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.
Comentários
- Veja também
-ok rm {} \;
no lugar de-exec rm {} \;
para confirmação interativa.
-delete
opção antes de-name
excluir a árvore de arquivos especificada , então acho que tenho que ter cuidado.find
recentes você pode usar-exec rm {} +
para remover todos os correspondidos arquivos com um único comandorm
..DS_Store
não ' t contêm quaisquer caracteres especiais, então as aspas são desnecessárias e não mudam nada neste caso.;
ou|
ou>
ou<
e “ e muitos outros que têm um significado especial para o shell, a menos que sejam citados.xargs
cuida do problema da lista de argumentos de tamanho limitado de forma transparente, dividindo-o em várias invocações do comando.