Com find
, você pode excluir um padrão:
find \! -name '*50000*' -delete
Escapar !
é necessário devido ao uso em shells.
Os diretórios com conteúdo não serão excluídos.
AVISO: uma vez que a partir da sua pergunta é um pouco claro para mim - isso excluirá outros arquivos em pastas que tenham um padrão 50000
, por exemplo, A/B/g
será removido e somente arquivos (e dirs) com o nome 50000
(incluindo seus diretórios pai) serão mantidos!
Para excluir todos os diretórios que não contêm nenhum arquivo 50000
e manter diretórios com esses arquivos, juntamente com os outros conteúdos desse diretório, sugiro um método de duas etapas:
-
listar todos os arquivos e diretórios e salvá-los em um arquivo de texto
find . -depth -mindepth 1 > all
-
lista os diretórios que precisam ser mantidos (localize somente o diretório de arquivos e impressão)
find . -depth -name '*50000*' printf '%h\n' > keep
-
escolha os arquivos e diretórios deletáveis com um
grep
invertidogrep -vf keep all > deletable
-
use essa lista para exclusão (apenas uma amostra)
while read line do find . -wholename "$line" -delete done < deletable
Observe que o ponto 4 é lento devido à natureza de ser um script de shell de linha por linha. Não é o melhor, mas fará o trabalho.
Como alternativa (e mais simples): Se você tiver acesso raiz intermediária, altere o i
-atribute, impedindo alterações, incluindo exclusão, exclua tudo (pois a exclusão não é permitida para i
-flagged files e dirs) e remova o sinal i
no final.
#%h goes for parent directories of our hits
find -name '*5000*' -printf '%hfind \! -name '*50000*' -delete
' | xargs -0 chattr -R +i '{}'
#be careful now ....
rm -r *
chattr -i -R *