Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Glob specifiers for intermediate path components
- X-seq: zsh-users 19447
- From: Mikael Magnusson <mikachu@xxxxxxxxx>
- To: Jörg Ziefle <joerg.ziefle@xxxxxxxxx>
- Subject: Re: Glob specifiers for intermediate path components
- Date: Wed, 26 Nov 2014 19:00:23 +0100
- Cc: Zsh Users <zsh-users@xxxxxxx>
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; bh=nIvEjsXhj4BYhD5gOr726SDyrB9DCKWZXwx3KgeZ0lY=; b=PqcpatetxGMtnE7DMbtkonOcpPl6UdaMudsTYfhDasvLKrwTrK70LasscE9d7WXWE5 kQcR3QiHAssh44D+/av+mOjEdLWUhKde41OMwYFuvfda38MIGJsXhmj60JRCpmjjhVIV wndkIijHlq9odQ5zXjc3Lo1Xq900PnyLntkzZJk2APSFKxnrWvxdp/v2lHw6h43iTuAW 7q0FLJlUTaC/is744JgWDonrdMdwzJNRQ/z3DjIuZpMYx7HeVZK2P3YzojJ3jQq9gdHp Dkn71xcl1cvVOjB0UwvofW0j/SGgVv7nMh+3p1rPG5awsnShQWxZaT0tbtgBDNZH8i6H Jkkw==
- In-reply-to: <CAO8h=njW+7we5z+_E8pCYKdCG3UGUqWEJAZpsaQTts25ENpOyw@mail.gmail.com>
- List-help: <mailto:zsh-users-help@zsh.org>
- List-id: Zsh Users List <zsh-users.zsh.org>
- List-post: <mailto:zsh-users@zsh.org>
- Mailing-list: contact zsh-users-help@xxxxxxx; run by ezmlm
- References: <CAO8h=njW+7we5z+_E8pCYKdCG3UGUqWEJAZpsaQTts25ENpOyw@mail.gmail.com>
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