O tópico da exclusão de arquivos é abordado na seção "Limpeza" na documentação do GNU findutils. Você pode ler isso em seu sistema usando "info find" ou dentro do Emacs. Você também pode visualizá-lo on-line no link .
find .... -delete
Esta é a opção mais segura (contra corridas de links simbólicos) e de alto desempenho (já que não há necessidade de executar nada ou executar uma alternância de contexto quando o buffer de canal está cheio). Mas tenha em mente que -delete implica -depth.
find .... | xargs rm ...
Isso é perigoso em situações em que outros têm acesso de gravação à árvore na qual você está fazendo a limpeza. Por exemplo, supondo que o comando find tenha decidido que /var/tmp/scratch/me/.ssh/config corresponde aos seus requisitos e, portanto, imprime esses nomes para stdout. O comando xargs lerá isso e o adicionará a uma estrutura de dados. Pouco tempo depois (quando xargs leu o número de bytes indicado pelo valor padrão da opção -s) os xargs irão bifurcar e executar rm para deletá-lo. No entanto, é possível que, no meio tempo, outra pessoa tenha feito isso:
$ cd /var/tmp/scratch
$ mv me me.old
$ ln -s /root me
Então, quando o rm apagar o /var/tmp/scratch/me/.ssh/config, ele emitirá a chamada do sistema unlink ("/ var / tmp / scratch / me / .ssh / config"). Como o kernel resolverá o link simbólico para você, isso é equivalente a ele chamar unlink ("/ root / .ssh / config"). Se o processo xargs estava rodando como root, então /root/.ssh/config será deletado, apesar do fato de que você não especificou -L na linha de comando. Por esse motivo, se a segurança for importante, use -delete. Você pode ler mais sobre esta área na seção "Considerações sobre Segurança" do manual de busca GNU.
find .... -exec rm ...;
Como isso também envolve fork / exec, ele tem os mesmos problemas de segurança que mencionei acima.
Em suma, a única razão para não usar -delete é a compatibilidade com sistemas que não têm suporte para -delete.