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 extglob
lo que parece significarextglob = off
.Respuestas:
Si realmente quieres usar patrones de bash puedes hacer esto:
Prefiero usar encontrar (sin embargo, adjuntar
-delete
Si 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 necesariasfind
parece más simple