Não chame rm -rf . Assim que você executá-lo em um diretório, isso exclui todos os arquivos no diretório e nos subdiretórios, até mesmo os que você deseja manter. Mais geralmente, não chame rm -rf a menos que você saiba por que um simples rm não funcionará. Aqui, rm -f é garantido se você quiser ter certeza de que seu script não solicitará a confirmação para excluir um arquivo somente leitura, mas -r claramente não é garantido.
Para excluir apenas os arquivos:
find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a -exec rm -f {} +
Se você também quiser excluir os diretórios que ficarem vazios, chame rmdir neles. Use -depth para que o conteúdo do diretório seja considerado antes do próprio diretório.
find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a \( -type d rmdir {} \; -o -exec rm -f {} \; \)
Você receberá erros de rmdir em execução em diretórios não vazios, eles são irritantes, mas inofensivos.
Se a sua descoberta tiver -delete e -empty (por exemplo, encontrar GNU), não será necessário chamar rm e rmdir .
find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a ! -type d ! -empty -delete