Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Glob specifiers for intermediate path components



On Wed, Nov 26, 2014 at 6:32 PM, Jörg Ziefle <joerg.ziefle@xxxxxxxxx> wrote:
> Suppose I have the following directory structure:
>
> $ mkdir a
> $ touch a/1
> $ ln -s a b
> $ ls -ld a b a/1
> drwxr-xr-x  3 jozi  staff  102 Nov 26 18:27 a
> -rw-r--r--  1 jozi  staff    0 Nov 26 18:27 a/1
> lrwxr-xr-x  1 jozi  staff    1 Nov 26 18:27 b -> a
>
> Globbing for files within directories, I get the file within the
> directory pointed by symlink b too:
>
> $ print -l */*(.)
> a/1
> b/1
>
> How can I restrict the globbing for the first directory level to
> directories only, excluding symlinks to directories? The obvious
> doesn't work:
>
> $ print -l *(/)/*(.)
> zsh: bad pattern: *(/)/*(.)
>
> More generally, how can I specify glob qualifiers for intermediate
> path components? In spirit:
>
> $ print -l a(...)/b(...)/c(...)/d(...)/e(...)/f(...)
>
> where (...) denotes glob qualifiers for the respective path components, or even:
>
> $ print -l {{a(...)/b(...)}/c(...)}

You can't, as such. There are at least two workarounds I can think of.

print -l a(/e:'REPLY=$REPLY/b(/)':)
(this one quickly gets messy to nest)

() { print -l $^@/b(/) } a(/)
() { () { print -l $^@/c(/) } $^@/b(/) } a(/)
You may need to add N in the glob quals here too, or intermediate
directories with no children would produce a glob error.

Note more specifically also that **/*(.) does not recurse through
symlinks to directories, ***/*(.) would.

-- 
Mikael Magnusson



Messages sorted by: Reverse Date, Date, Thread, Author