zsh-users
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: Zsh Users <zsh-users@zsh.org>
Subject: Re: /proc slows % echo /**/*/etc/r*(/N)
Date: Sun, 21 Jan 2024 11:09:52 -0800	[thread overview]
Message-ID: <CAH+w=7ZQioZ5BgYMYzsp+8aqB2iq4Tm3Fm_WHMpGYPVbn+u8bg@mail.gmail.com> (raw)
In-Reply-To: <62da1cec-bcc9-49ed-8f5f-ad428fdd3f20@eastlink.ca>

On Sun, Jan 21, 2024 at 9:19 AM Ray Andrews <rayandrews@eastlink.ca> wrote:
>
> I used to do this kind of thing without any problems:
>
>      % echo /**/*/etc/r*(/N)
>
> ... but just trying it, zsh labors for close to an hour, then spits out
> countless pages of:
>
> /proc/9/root/etc/rc0.d /proc/9/root/etc/rc1.d /proc/9/root/etc/rc2.d

Why /**/*/ rather than just /**/ ?  The extra /*/ there will expand
symbolic links, which are normally skipped by /**/.  It's not
otherwise adding anything to the traversal.

/proc/9 is for PID 9 and /proc/9/root is a symbolic link to the root
directory for that process, so by expanding that you're traversing the
whole filesystem again, which takes you back to /proc/ again, and so
on for every PID until zsh gives up (probably because it can't
allocate any more memory).

> ... I'm wondering why /proc wasn't a problem previously

I suspect previously you weren't adding that extra /*/.  What do you
mean for that to accomplish?

> and if there's
> anything I can do to filter it out of the search -- probably all the
> Linux 'system' directories too.  I recall that there's some test,
> something in permissions, some flag -- that identifies these
> not-quite-real directories -- zsh knows who they are.

There's no glob qualifier for that, if that's what you mean.  As it
happens, those directories always appear to be empty, so you can find
them with /*(/L0) but you can't use glob qualifiers in the middle of a
longer pattern (only at the end) so that won't help with your
recursive search.

> I know the tilde is used to make exceptions:
> but I can't get the syntax correct with the above.

That syntax is applied as a string match after the glob has already
expanded, so putting it at the end like this ...

>      % echo /**/*/etc/r*~/proc*(/N)

... is just going to waste even more time.

As Mark suggested, there are exclusion patterns you can apply, but
/**/ is still going to search the whole filesystem at least once,
possibly crossing mount points into other filesystems if you have
anything NFS or similarly remote mounted.

Without trying it, which I'm not going to do, I think the answer to
your specific question might be:

echo /**/^(proc|sys)/etc/r*(N)

But that might actually miss /etc/r* because it would be looking for
/etc/etc/.  There's no syntax for excluding things specifically from
the ** pattern.


  parent reply	other threads:[~2024-01-21 19:10 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-21 17:19 Ray Andrews
2024-01-21 18:00 ` Mark J. Reed
2024-01-21 18:02   ` Mark J. Reed
2024-01-21 18:08     ` Ray Andrews
2024-01-21 20:09       ` Juergen Christoffel
2024-01-21 20:59         ` Ray Andrews
2024-01-21 19:09 ` Bart Schaefer [this message]
2024-01-21 19:58   ` Ray Andrews
2024-01-21 21:48     ` Bart Schaefer
2024-01-22  0:07       ` Ray Andrews
2024-01-22  1:02         ` Bart Schaefer
2024-01-22  1:54           ` Ray Andrews
2024-01-22  6:00   ` Mikael Magnusson
2024-01-22 15:06     ` Ray Andrews

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAH+w=7ZQioZ5BgYMYzsp+8aqB2iq4Tm3Fm_WHMpGYPVbn+u8bg@mail.gmail.com' \
    --to=schaefer@brasslantern.com \
    --cc=zsh-users@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).