Matching All "Dot Files" with Wildcards

If you want to match all files in a directory whose names do not start with a dot (), it's easy: just use an asterisk (*). But what about files that do start with a dot? That's harder because dot-asterisk (*) matches the directory links named and that are in every directory; you usually won't want to match those.

The Korn and some Bourne shells, as well as bash, let you use the sequence [!.]* to match all dot files, where [!.] means "anything but a dot." tcsh understands [^.]* instead.

Otherwise, what can you do? You can use ??*, which matches all filenames that start with a dot and have at least two characters, but that doesn't match filenames like a with just one character after the dot. Here's the answer:

[^A--0-^?]*

That expression matches all filenames whose second character is in the ASCII chart () but isn't a dot or a slash (/). The range starts with CTRL-a (^A is an actual CTRL-a character, not the two characters ^ and A) and runs through a dash (-). Then it covers the range from zero () through DEL or CTRL-? (make by pressing your DELETE or RUBOUT key; you may have to type CTRL-v or a backslash () first).

Yuck - that's sort of complicated. To make it easy, I set that sequence in a shell variable named dots from my shell setup file (). Here are three versions; the third is for shells whose built-in echo doesn't understand nnn sequences:

set dots=".[`echo Y-0-Z | tr YZ \\001\\177`]" csh dots=".[`echo \\\\001-0-\\\\0177`]*" sh, etc. dots=".[`echo Y-0-Z | tr YZ \\001\\177`]*" sh with old echo

(The tr command in backquotes () turns the expression Y--0-Z into the range with CTRL-a and DEL that we want. That keeps ugly, unprintable characters out of the cshrc file. See article .) So, for example, I could move all files out of the current directory to another directory by typing:

% mv * $dots /somedir

- JP