From mboxrd@z Thu Jan 1 00:00:00 1970 From: "13mb80000-HallM(DR3132)37x10" To: cygwin@sourceware.cygnus.com Subject: Re: How do I list subdirectories? Date: Tue, 31 Aug 1999 23:49:00 -0000 Message-ID: <199908252041.OAA07680@chorus> X-SW-Source: 1999-08n/msg00693.html Message-ID: <19990831234900.br6qz0LPwlBk9JeQZkmbB18Oc54H9k_T0rg80jqCoy4@z> > 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