Thicket data repository for the EEG
1{
2 "id": "https://mort.io/blog/reverse-find/",
3 "title": "Reverse `find`",
4 "link": "https://mort.io/blog/reverse-find/",
5 "updated": "2025-02-05T00:00:00",
6 "published": "2025-02-05T00:00:00",
7 "summary": "<p>In the last few days I discovered I needed to search back up the filesystem from\n<code>$CWD</code> to find the first occurence of a file (specifically, a <code>Justfile</code> but\nthat’s by-the-by). Got bored of doing it by hand so wrote a\n<a href=\"https://www.gnu.org/software/bash/\"><code>bash</code></a> shell function; here ’tis:</p>\n<pre><code><span><span><span>rf</span> <span>(</span><span>)</span> <span>{</span>\n</span></span><span><span><span> <span>local</span> <span>D</span></span>\n</span></span><span><span> <span>while</span> <span><span>!</span></span><span> eza<span><span> -</span>l</span> <span><span>"</span><span><span>$</span><span>{</span></span><span><span>D</span></span><span><span>:=</span></span><span>.</span><span><span>}</span></span>/<span><span>$</span><span>1</span></span><span>"</span></span></span><span>;</span> <span>do</span> <span><span>#</span></span><span> first, check `$CWD`</span><span>\n</span></span></span><span><span> <span>[</span><span> <span><span>"</span><span><span>$</span><span>(</span><span><span>realpath</span></span><span> <span><span>"</span><span><span>$</span><span>D</span></span>/<span><span>$</span><span>1</span></span><span>"</span></span></span><span>)</span></span><span>"</span></span> <span>==</span> <span><span>"</span>/<span><span>$</span><span>1</span></span><span>"</span></span> <span>]</span></span> <span>&&</span> <span>break</span> <span><span>#</span></span><span> stop if we hit `/` already</span><span>\n</span></span></span><span><span> <span>D</span><span>=</span><span><span><span>$</span><span>D</span></span>/..</span> <span><span>#</span></span><span> else, iterate one layer up</span><span>\n</span></span></span><span><span> <span>done</span>\n</span></span><span><span><span>}</span></span>\n</span></code></pre>\n<p>Invoke as (e.g.,) <code>rf Justfile</code>. Alternatively, as a one-liner:</p>\n<pre><code><span><span>F</span><span>=</span><span>Justfile</span><span></span><span>;</span> <span>while</span> <span><span>!</span></span><span> eza<span><span> -</span>l</span> <span><span>$</span><span>{</span></span><span><span>D</span></span><span><span>:=</span></span><span>.</span><span><span>}</span></span>/<span><span>$</span><span>F</span></span></span><span>;</span> <span>do</span> <span>[</span><span> <span><span>"</span><span><span>$</span><span>(</span><span><span>realpath</span></span><span> <span><span>$</span><span>D</span></span>/<span><span>$</span><span>F</span></span></span><span>)</span></span><span>"</span></span> <span>==</span> <span><span>"</span>/<span><span>$</span><span>F</span></span><span>"</span></span> <span>]</span></span> <span>&&</span> <span>break</span><span>;</span> <span>D</span><span>=</span><span><span><span>$</span><span>D</span></span>/..</span><span></span><span>;</span> <span>done</span><span>;</span> <span><span>unset</span></span><span> D</span>\n</span></code></pre>",
8 "content": "<p>In the last few days I discovered I needed to search back up the filesystem from\n<code>$CWD</code> to find the first occurence of a file (specifically, a <code>Justfile</code> but\nthat’s by-the-by). Got bored of doing it by hand so wrote a\n<a href=\"https://www.gnu.org/software/bash/\"><code>bash</code></a> shell function; here ’tis:</p>\n<pre><code><span><span><span>rf</span> <span>(</span><span>)</span> <span>{</span>\n</span></span><span><span><span> <span>local</span> <span>D</span></span>\n</span></span><span><span> <span>while</span> <span><span>!</span></span><span> eza<span><span> -</span>l</span> <span><span>"</span><span><span>$</span><span>{</span></span><span><span>D</span></span><span><span>:=</span></span><span>.</span><span><span>}</span></span>/<span><span>$</span><span>1</span></span><span>"</span></span></span><span>;</span> <span>do</span> <span><span>#</span></span><span> first, check `$CWD`</span><span>\n</span></span></span><span><span> <span>[</span><span> <span><span>"</span><span><span>$</span><span>(</span><span><span>realpath</span></span><span> <span><span>"</span><span><span>$</span><span>D</span></span>/<span><span>$</span><span>1</span></span><span>"</span></span></span><span>)</span></span><span>"</span></span> <span>==</span> <span><span>"</span>/<span><span>$</span><span>1</span></span><span>"</span></span> <span>]</span></span> <span>&&</span> <span>break</span> <span><span>#</span></span><span> stop if we hit `/` already</span><span>\n</span></span></span><span><span> <span>D</span><span>=</span><span><span><span>$</span><span>D</span></span>/..</span> <span><span>#</span></span><span> else, iterate one layer up</span><span>\n</span></span></span><span><span> <span>done</span>\n</span></span><span><span><span>}</span></span>\n</span></code></pre>\n<p>Invoke as (e.g.,) <code>rf Justfile</code>. Alternatively, as a one-liner:</p>\n<pre><code><span><span>F</span><span>=</span><span>Justfile</span><span></span><span>;</span> <span>while</span> <span><span>!</span></span><span> eza<span><span> -</span>l</span> <span><span>$</span><span>{</span></span><span><span>D</span></span><span><span>:=</span></span><span>.</span><span><span>}</span></span>/<span><span>$</span><span>F</span></span></span><span>;</span> <span>do</span> <span>[</span><span> <span><span>"</span><span><span>$</span><span>(</span><span><span>realpath</span></span><span> <span><span>$</span><span>D</span></span>/<span><span>$</span><span>F</span></span></span><span>)</span></span><span>"</span></span> <span>==</span> <span><span>"</span>/<span><span>$</span><span>F</span></span><span>"</span></span> <span>]</span></span> <span>&&</span> <span>break</span><span>;</span> <span>D</span><span>=</span><span><span><span>$</span><span>D</span></span>/..</span><span></span><span>;</span> <span>done</span><span>;</span> <span><span>unset</span></span><span> D</span>\n</span></code></pre>",
9 "content_type": "html",
10 "author": {
11 "name": "Unknown",
12 "email": null,
13 "uri": null
14 },
15 "categories": [],
16 "source": "https://mort.io/atom.xml"
17}