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