How do I construct a shell glob-pattern that matches all files

How do I construct a shell glob-pattern that matches all files


You'd think this would be easy.

* Matches all files that don't begin with a ".";

.* Matches all files that do begin with a ".", but
this includes the special entries "." and "..",
which often you don't want;

.[!.]* (Newer shells only; some shells use a "^" instead of
the "!"; POSIX shells must accept the "!", but may
accept a "^" as well; all portable applications shall
not use an unquoted "^" immediately following the "[")

Matches all files that begin with a "." and are
followed by a non-"."; unfortunately this will miss
"..foo";

.??* Matches files that begin with a "." and which are
at least 3 characters long. This neatly avoids
"." and "..", but also misses ".a" .

So to match all files except "." and ".." safely you have to use
3 patterns (if you don't have filenames like ".a" you can leave
out the first):

.[!.]* .??* *

Alternatively you could employ an external program or two and use
backquote substitution. This is pretty good:

`ls -a | sed -e '/^\.$/d' -e '/^\.\.$/d'`

(or `ls -A` in some Unix versions)

but even it will mess up on files with newlines, IFS characters
or wildcards in their names.

In ksh, you can use: .!(.|) *



Home FAQ