[Chapter 15] 15.5 Matching All "Dot Files" with Wildcards
Author: Jerry Peek, Tim O'Reilly & Mike Loukides
Date: 1998-08-04T21:37:24Z

#

| Chapter 15 Wildcards |

## 15.5 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 (51.3) 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 (`0`) 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 (2.2). 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 (9.16) 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 45.35.) So, for example, I could move all files out of the current directory to another directory by typing:

>     % mv * $dots /somedir

- JP

15.4 What if a Wildcard Doesn't Match? |  | 15.6 Maybe You Shouldn't Use Wildcards in Pathnames