UNIX FAQ Version 2.1 92/12/04 -- Question 2.11

UNIX FAQ Version 2.1 92/12/04 -- Question 2.11

How do I construct a shell glob-pattern that matches all files except "." and ".." ?

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.