It's not news that the shell turns
.*
(dot asterisk) into every name in the current directory that starts with a dot:
.login
,
.profile
,
.bin
(I name my directory that way), and so on - including
.
and
..
too.
Also, many people know that the shell turns
*/.*
into a list of the dot files in subdirectories:
foo/.exrc
,
foo/.hidden
,
bar/.xxx
-as well as
foo/.
,
foo/..
,
bar/.
, and
bar/..
, too. (If that surprises you, look at the wildcard pattern closely - or try it on your account with the
echo
command:
echo
*/.*
.)
What if you're trying to match just the subdirectory names, but not the files in them? The most direct way is:
*/.
-that matches
foo/.
,
bar/.
, and so on. The dot (
.
) entry in each directory
is a link to the directory itself (
18.2
,
14.4
)
, so you can use it wherever you use the directory name. For example, to get a list of the names of your subdirectories, type:
$ls -d */.
bar/. foo/.
(The
-d
option (
16.8
)
tells
ls
to list the names of directories, not their contents.) With some C shells (but not all), you don't need the trailing dot (
.
):
%ls -d */
bar/ foo/
(The shell passes the slashes (
/
) to
ls
. So, if you use the
ls
-F
option (
16.12
)
to put a slash after directory names, the listing will show
two
slashes after each directory name.)
When matching directory names that start with a dot, the shells expand the
.*/
or
.*/.
and pass the result to
ls
-so you really don't need the
ls
-a
option (
16.11
)
. The
-a
is useful only when you ask
ls
(not the shell) to read a directory and list the entries in it. You don't have to use
ls
, of course. The
echo
(
8.6
)
command will show the same list more simply.
Here's another example: a Bourne shell loop that runs a command in each subdirectory of your home directory:
for dir in $HOME/*/. do cd $dir ... Do something ... done
That doesn't take care of subdirectories whose names begin with a dot, like my .bin -but article 15.5 shows a way to do that too.
Article 21.12 shows a related trick that doesn't involve the shell or wildcards: making a pathname that will match only a directory.
-