delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/1999/08/25/16:50:21

Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm
List-Unsubscribe: <mailto:cygwin-unsubscribe-archive-cygwin=delorie DOT com AT sourceware DOT cygnus DOT com>
List-Subscribe: <mailto:cygwin-subscribe AT sourceware DOT cygnus DOT com>
List-Archive: <http://sourceware.cygnus.com/ml/cygwin/>
List-Post: <mailto:cygwin AT sourceware DOT cygnus DOT com>
List-Help: <mailto:cygwin-help AT sourceware DOT cygnus DOT com>,
<http://sourceware.cygnus.com/ml/#faqs>
Sender: cygwin-owner AT sourceware DOT cygnus DOT com
Delivered-To: mailing list cygwin AT sourceware DOT cygnus DOT com
Message-Id: <199908252041.OAA07680@chorus>
Date: Wed, 25 Aug 1999 14:41:09 -0600 (MDT)
From: "13mb80000-HallM(DR3132)37x10" <marcus AT bighorn DOT dr DOT lucent DOT com>
Reply-To: "13mb80000-HallM(DR3132)37x10" <marcus AT bighorn DOT dr DOT lucent DOT com>
Subject: Re: How do I list subdirectories?
To: cygwin AT sourceware DOT cygnus DOT com
X-Mailer: dtmail 1.2.1 CDE Version 1.2.1 SunOS 5.6 sun4m sparc
X-Sun-Text-Type: ascii

> Nice try but 
> ls -F | egrep .*\/ 
> doesn't work.
> I agree that it ought to. I don't understand why it
> doesn't.


For a hint, try the command:
	echo .*\/
and you will see that the shell globs the argument.  Depending on the contents
of the directory, you will get something like ./ ../ as output from the echo.
So, the command:
	ls -F | egrep .*\/
is the same as saying
	ls -F | egrep ./ ../
Which certainly isn't what you want.

Try
	ls -F | egrep '.*\/'

> However Kim Poulsen found a command that does work:
> ls -F | egrep \/
> 
> It seems that this is a question on pattern matching.
> It seems to me that a directory which is mached by:
> \/
> should also be matched by
> *\/
> and 
> .*\/

Egrep works with regular expressions, shell works with glob expressions.
In regular expressions, the * means zero or more of whatever preceeded the
*.  Thus, in the second case, since there was nothing preceeding the *,
it really doesn't make sense as a regular expression.  If you pass that
to egrep (remember to quote it to protect it from the shell) egrep reports
a syntax error.

So, when passed to egrep, the first pattern recognizes a slash (I still
don't understand the need to escape the slash, since it has no particular
meaning to egrep.)  The second pattern is a syntax error, and the third
pattern matches anything (or nothing) and then a slash.

As shell glob expressions, the first pattern doesn't contain any glob
characters and so it would be passed as a slash (the shell does remove
the escape backslash).  The second pattern would match any path that can
be constructed with anything (the *) followed by a slash.  This gives
you all of the directories within the current directory (at least those
that don't start with a ., because the shell doesn't expand * to include
those files).  The third expression would match any path that can be
constructed with a leading ., then anything, then a slash.  So, using
the shell instead of egrep, we can come very close to the desired behavior
with the command:
	echo */ .*/
When the shell processes the arguments, the first argument will be replaced
with all directories that do not begin with a '.' and the second will be
replaced with all directories that do begin with a '.'.  The only problem
here is that if the pattern doesn't match anything, then it will be left
there and not expanded.  So, if you have a basically empty directory, this
will produce
	*/ ./ ../
since the first argument is not expanded (nothing matches it) and the second
matches the current and parent directories.  To eliminate this bother, we
can use ls instead and throw away the error, so the command:
	ls -d */ .*/ 2>/dev/null
should show all the directories within the current directory.

marcus hall

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe AT sourceware DOT cygnus DOT com

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019