When I use below code in Ubuntu terminal, it works fine:
rm !(*.sh) -rf
But if I place the same line code in a shell script (clean.sh) and run the shell script from terminal, it throws an error:
clean.sh script:
#!/bin/bash
rm !(*.sh) -rf
The error I get:
./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'
can you help?
rm !(*.sh)
is a extglob
syntax which means remove all files except the ones that have the .sh
extension.
In your interactive bash
instance, the shell option extglob
is on :
$ shopt extglob
extglob on
Now as your script is running in a subshell, you need to enable extglob
by adding this at the start of the script :
shopt -s extglob
So your script looks like :
#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)
EDIT :
To remove all files except .sh
extension ones use GLOBIGNORE
(as you don't want to enable extglob
) :
#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *
Example :
$ ls -1
barbar
bar.sh
egg
foo.sh
spam
$ GLOBIGNORE='*.sh'
$ rm *
$ ls -1
bar.sh
foo.sh
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments