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