Tudo bem, vamos fazer isso progressivamente.
Como primeiro passo, este é apenas um exercício simples ao passar um curinga ao comando find , lembrando-se de citar, é claro, e executar o comando rm para cada arquivo encontrado:
find ${BASE_DIR}/ -name '*_*' -exec rm {} \;
Mas é claro que isso é terrivelmente ineficiente. Ele inicia um processo rm inteiro para cada arquivo individual. Então, enquanto nós poderíamos fazer um pequeno desvio através de \+ , não é para onde vamos acabar, então vamos pegar a rota mais curta e trazer xargs para agrupar os nomes dos arquivos em grupos:
find ${BASE_DIR}/ -name '*_*' -print | xargs rm
Mas isso tem dois buracos de segurança. Primeiro, se algum nome de arquivo encontrado começar com um sinal de menos rm irá tratá-lo como uma opção de linha de comando em vez de um nome de arquivo, e gerará um erro. (A versão -exec rm {} também tem esse problema.) Segundo, nomes de arquivos contendo espaço em branco não serão tratados corretamente por xargs . Então, uma nova iteração é tornar isso um pouco mais à prova de balas:
find ${BASE_DIR}/ -name '*_*' -print0 | xargs -0 rm --
E, claro, existem os recursos interativos de rm que você provavelmente não deseja:
find ${BASE_DIR}/ -name '*_*' -print0 | xargs -0 rm -f --
As opções -print0 e -0 não são padrão, mas o% GNUfind e xargs , assim como o FreeBSD find e xargs , os entendem. No entanto, até isso é improvável. Nós não precisamos gerar nenhum processo extra. O GNU e o FreeBSD find s podem invocar a chamada do sistema unlink(2) diretamente:
find ${BASE_DIR}/ -name '*_*' -delete
Como última medida preventiva para impedir que você faça mais do que pretendia em determinadas circunstâncias, lembre-se de que o sistema de arquivos pode conter mais do que apenas arquivos regulares:
find ${BASE_DIR}/ -name '*_*' -type f -delete