This is the mail archive of the cygwin@sourceware.cygnus.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: How do I list subdirectories?



> 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@sourceware.cygnus.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]