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
-