List files not matching a pattern?

Little known bash expansion rule:

ls !(*.jar)

Use egrep-style extended pattern matching.

ls !(*.jar)

This is available starting with bash-2.02-alpha1. Must first be enabled with

shopt -s extglob

As of bash-4.1-alpha there is a config option to enable this by default.


ls | grep -v '\.jar$'

for instance.


With an appropriate version of find, you could do something like this, but it's a little overkill:

find . -maxdepth 1 ! -name '*.jar'

find finds files. The . argument specifies you want to start searching from ., i.e. the current directory. -maxdepth 1 tells it you only want to search one level deep, i.e. the current directory. ! -name '*.jar' looks for all files that don't match the regex *.jar.

Like I said, it's a little overkill for this application, but if you remove the -maxdepth 1, you can then recursively search for all non-jar files or what have you easily.