Estoy tratando de eliminar todos los archivos y directorios en /path/to/dir/ salvo dos directorios ( dir1 y dir2 ) desde un host remoto utilizando SSH. Cuando ejecuto un comando similar a este en mi caja de Ubuntu 14.04 local, funciona como se esperaba:
user@host1:~$ cd /path/to/dir/ && rm -rf !(dir1|dir2)
Si intento ejecutar el mismo comando a través de SSH en otro host con la misma estructura de directorios, falla.
user@host1:~$ ssh user@host2 'cd /path/to/dir/ && rm -rf !(dir1|dir2)'
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd /path/to/dir/ && rm -rf !(dir1|dir2)'
¿Cómo debo escapar del comando para que funcione? Pensé que usar comillas simples era suficiente.

ssh user@host2 'shopt -p extglob'?shopt -u extgloblo que parece significarextglob = off.Respuestas:
Si realmente quieres usar patrones de bash puedes hacer esto:
Prefiero usar encontrar (sin embargo, adjuntar
-deleteSi realmente quieres borrar los archivos):Ejemplo con directorios:
fuente
dotblob. Mi versión final esssh user@host2 'bash -O extglob -O dotglob -c "cd /path/to/dir/ && rm -rf !(dir1|dir2)"'. Al principio me atrajo el enfoque de la lista de patrones debido a su elegancia y suavidad, pero tiene razón: después de agregar todas las opciones necesariasfindparece más simple