Error de sintaxis cerca del token inesperado `('

11

Cuando uso el siguiente código en el terminal de Ubuntu, funciona bien:

rm !(*.sh) -rf

Pero si coloco el mismo código de línea en un script de shell (clean.sh) y ejecuto el script de shell desde la terminal, arroja un error:

script clean.sh:

#!/bin/bash
rm !(*.sh) -rf

El error que obtengo:

./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'

¿puede usted ayudar?

Tal
fuente

Respuestas:

23

rm !(*.sh)es una extglobsintaxis que significa eliminar todos los archivos excepto los que tienen la .shextensión.

En su bashinstancia interactiva , la opción de shell extglobestá activada :

$ shopt extglob 
extglob         on

Ahora que su script se ejecuta en una subshell, debe habilitarlo extglobagregando esto al comienzo del script:

shopt -s extglob

Entonces su guión se ve así:

#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)

EDITAR:

Para eliminar todos los archivos, excepto los de .shextensión, use GLOBIGNORE(ya que no desea habilitar extglob):

#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *

Ejemplo:

$ ls -1
barbar
bar.sh
egg
foo.sh
spam

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh
heemayl
fuente
¿Puedo cambiar mi comando que hace lo mismo sin ejecutar esto? shopt -s extglob?
Tal
@Tal revisa mis ediciones ..
heemayl
1
gracias :) (overflaw de pila me hace escribir 15 caracteres en el comentario :( :( :()
Tal
pero aquí hay dos buenas respuestas!
Tal
1
Esta debería ser la respuesta aceptada, ya que en realidad responde la pregunta, mientras que la otra solo describe una solución alternativa.
Guntram Blohm apoya a Monica el
4

Ok, es una publicación cruzada, pero tengo que escribir una respuesta. ;)

Podrías usar finden su lugar

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;
AB
fuente
2

Necesitas encender extglob:

shopt -s extglob
choroba
fuente
1
@ Pilot6: Ver man bash. Habilita el globbing extendido como !(...).
choroba
¿Puedo cambiar mi comando que hace lo mismo sin ejecutar esto? shopt -s extglob
Tal