Reputation: 171
Using the pattern match !("file1")
does not work within a bash script but will work on the command line.
For example:
ls !("file1"|"file2")
This will list all files in directory except file1
and file2
.
When that line is executed in a script this error is displayed:
./script.sh: line 1: syntax error near unexpected token `('
./script.sh: line 1: ` ls !("file1"|"file2") '
Regardless what is used rm -v !("file1")
. The same error takes place. What is going on here why does this not work in a script?
Upvotes: 16
Views: 2699
Reputation: 2030
Method with default settings and no external procs:
for f in *; do [[ $f =~ ^file[12]$ ]] || echo "$f"; done
Upvotes: 3
Reputation: 189467
The extended glob syntax you are trying to use is turned off by default; you have to enable it separately in each script where you want to use it.
shopt -s extglob
Scripts should not use ls
though I imagine you were using it merely as a placeholder here.
Upvotes: 17
Reputation: 7746
Globbing doesn't work that way unless you enable extglob
shell opt. Instead, I recommend using find
:
find . -maxdepth 1 -not -name '<NAME>' -or -name '<NAME>' -delete
before running this command with -delete
ensure the output is correct
Upvotes: 5