search: eliminar carpeta y subcarpetas, pero agregar exception a dos files

Estoy tratando de usar el command find para hacer lo siguiente:
Elimine una carpeta completa con files, carpetas y subcarpetas a exception de 2 files, aquí hay un ejemplo de lo que necesito:

  test/folder1/file1.txt test/folder1/file2.txt test/folder1/subfolder1/ test/folder1/subfolder1/file3.txt test/folder1/subfolder1/subfolder2/file4.txt test/folder2/file5.txt test/folder3/file6.txt 

Necesito borrar todo excepto para file2.txt y file3.txt

Esto es lo que ya hice

  find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' 

Esto me mostrará todos los files, excepto los que especifiqué. Sin embargo, si agrego -exec rm -rf {} al final del command, se eliminará todo.

También probé este otro command y no funcionó

 rm -r test/folder1/ !(file2.txt|file3.txt) 

No sé mucho sobre la expresión regular, así que estoy tratando de hacerlo funcionar probando los commands que encontré en línea, sin embargo, ninguno de ellos parece estar funcionando.

No llame a rm -rf . Tan pronto como lo ejecuta en un directory, elimina todos los files en el directory y los subdirectorys, incluso los que desea conservar. De manera más general, no llame a rm -rf less que sepa por qué una simple rm no funcionará. Aquí, rm -f está garantizado si desea asegurarse de que su script no solicite confirmación para eliminar un file de solo lectura, pero -r claramente no está garantizado.

Para simplemente eliminar los files:

 find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a -exec rm -f {} + 

Si también desea eliminar los directorys que se vuelven vacíos, llame a rmdir sobre ellos. Use -depth para que los contenidos del directory se consideren antes que el directory en sí.

 find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a \( -type d rmdir {} \; -o -exec rm -f {} \; \) 

Obtendrá errores de rmdir de rmdir en directorys no vacíos, son molestos pero inofensivos.

Si su búsqueda tiene -delete y -empty (por ejemplo, GNU find), no necesita llamar a rm y rmdir .

 find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a ! -type d ! -empty -delete 

Mira, tampoco sé de manera indirecta cómo hacerlo con las opciones de find , pero también puedes usar scripts de shell en tu find :

Primero borre los files:

  find . -type f -exec bash -c \ ' [[ "{}" == "./test/folder1/file2.txt" || \ "{}" == "./test/folder1/subfolder1/file3.txt" ]] \ || rm "{}" ' \; 

Y luego borre todas las carpetas no vacías:

 find . -type d -exec rmdir {} \; 2>/dev/null