From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from primenet.com.au (ns1.primenet.com.au [203.24.36.2]) by inbox.vuxu.org (OpenSMTPD) with ESMTP id 824d9bac for ; Wed, 10 Jul 2019 13:38:25 +0000 (UTC) Received: (qmail 19825 invoked by alias); 10 Jul 2019 13:38:13 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: List-Unsubscribe: X-Seq: 24037 Received: (qmail 2745 invoked by uid 1010); 10 Jul 2019 13:38:13 -0000 X-Qmail-Scanner-Diagnostics: from cventin.lip.ens-lyon.fr by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.101.2/25503. spamassassin: 3.4.2. Clear:RC:0(140.77.13.17):SA:0(-1.9/5.0):. Processed in 4.018948 secs); 10 Jul 2019 13:38:13 -0000 X-Envelope-From: vincent@vinc17.net X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: none (ns1.primenet.com.au: domain at vinc17.net does not designate permitted sender hosts) Date: Wed, 10 Jul 2019 15:37:31 +0200 From: Vincent Lefevre To: zsh-users@zsh.org Subject: glob qualifier on intermediate directory / no symbolic links Message-ID: <20190710133731.GA13596@cventin.lip.ens-lyon.fr> Mail-Followup-To: zsh-users@zsh.org MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit X-Mailer-Info: https://www.vinc17.net/mutt/ User-Agent: Mutt/1.12.1+19 (078654a4) vl-117499 (2019-06-15) Is there a way to use a glob qualifier on an intermediate directory? At least, avoid symbolic links from being followed. For instance, with: % mkdir -p dir/dir2 % ln -s dir foo % touch {dir,dir/dir2}/file With recursive globbing, one can choose whether or not to follow symbolic links: % echo **/file dir/dir2/file dir/file % echo ***/file dir/dir2/file dir/file foo/dir2/file foo/file Without recursive globbing, * matches symbolic links: % echo */file dir/file foo/file But what if I don't want to match symbolic links? At the end of a pattern, (^@) can be used: % echo * dir foo % echo *(^@) dir but not inside a pattern: % echo *(^@)/file zsh: no matches found: *(^@)/file With EXTENDED_GLOB, I get both, like */file, because (...) is used here for grouping, not for a glob qualifier. % setopt EXTENDED_GLOB % echo *(^@)/file dir/file foo/file I would have expected the following to work, but doesn't. % echo (*(^@))/file dir/file foo/file The zshexpn(1) man page says: Glob Qualifiers Patterns used for filename generation may end in a list of qualifiers enclosed in parentheses. [...] What "patterns" means here is not clear. Above, one has (...) Matches the enclosed pattern. [...] ^^^^^^^ but it seems that this is not a pattern that can have a glob qualifier. I assume that except for the grouping exception and recursive globbing, this is because patterns are mainly string operations until the list of files before considering glob qualifiers is obtained. I'm wondering why the following is not accepted: % echo (*/)file zsh: bad pattern: (*/)file I think that (pat/) without a following # should match a single occurrence of pat/ (without following symbolic links, contrary to the case without parentheses). -- Vincent Lefèvre - Web: 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)