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