How to un-select files in shell wildcard patterns

Polytropon freebsd at
Fri Jun 21 23:40:41 UTC 2019

On Fri, 21 Jun 2019 10:44:56 -0500, Paul Schmehl wrote:
> --On June 21, 2019 at 5:49:09 AM +0200 Polytropon <freebsd at> wrote:
> > I'm interested in a convenient method to "un-select" files
> > when using regular (sh) shell wildcards. It's quite easy to
> > describe things like
> >
> > 	*.tex
> >
> > to perform an operation on all LaTeX source files, or
> >
> > 	*a*
> >
> > on all files whose name contains (at least) one "a". Patterns
> > that are based on the inclusion of certain attributes are not
> > a problem to deal with using the builtin pattern matching of
> > the shell.
> >
> > But what about the opposite? Let's say, perform an operation
> > on all files _except_ the LaTeX source files, or all files
> > whose name does _not_ contain an "a"?
> >
> > Is there a good method to do this, except creating a kind
> > of "custom regex wrapper script" that does the selection part,
> > for further use with `subshell` or | xargs?
> I feel almost silly trying to suggest anything to *you*, but egrep 
> '(foo|bar|zed|fam). does the trick. So, for example, if you want to do 
> something in the shell to act on all files except ones that end in .tex or 
> have an a in their name:
> ls -al| egrep '(a|\.tex)' * | awk (whatever), etc.

This is exactly what I an trying to avoid, i. e., not depend on
external programs, but instead use what the shell offers interally.

Of course, even regular grep can be used:

	ls | grep -v "a" | xargs ... foo ...


	foo `ls | grep -v "a"` ...

could implement the "_not_ this pattern" mechanism (just as the
use of "awk '!/a/" with the ls output, to generate a list of the
matching files (here: those that do _not_ match a certain pattern).

So, is it correct that there is no shell builtin mechanism for
this kind of "negative selection"?

Magdeburg, Germany
Happy FreeBSD user since 4.0
Andra moi ennepe, Mousa, ...

More information about the freebsd-questions mailing list