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

  • Entendo. Eu ' também li que usando a -delete opção antes de -name excluir a árvore de arquivos especificada , então acho que tenho que ter cuidado.
  • Em find recentes você pode usar -exec rm {} + para remover todos os correspondidos arquivos com um único comando rm.
  • .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.
  • Basicamente, apenas espaços em branco (espaços, tabulações, talvez outros) é a única coisa que faz com que uma string sem aspas seja interpretada como dois argumentos de linha de comando separados, mas que ' não é tudo que você tem que lamentar ao decidir se deve ou não citar. Você deve se preocupar com todos os metacaracteres de shell como ; ou | ou > ou < e “ e muitos outros que têm um significado especial para o shell, a menos que sejam citados.
  • @MarcoMarsala xargs cuida do problema da lista de argumentos de tamanho limitado de forma transparente, dividindo-o em várias invocações do comando.

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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *