

カレントディレクトリやその親ディレクトリ、さらなる祖先ディレクトリの直下にある、特定のファイル名のファイルを指定する方法を教えていただけますと嬉しいです。

ただし、そのようなものが複数ある場合、最も近い祖先のディレクトリの直下にあるファイルを示したいのです。

例えば、以下のようなフォルダ構造で、カレントディレクトリが `foo/src/hoge` だとします。

[code]

    $ ls -R foo
    Mintfile  src/
    
    foo/src:
    hoge/  Mintfile
    
    foo/src/hoge:
    fuga.swift
    $ cd foo/src/hoge
    
[/code]

この場合、 `foo/src/Mintfile` のみを指し示したいのです。

関数を定義して呼び出すことで、動いてはいるのですが、もっと良い表現がある気がしています。  
zshのワイルドカードや`find`コマンドを用いた、できるだけシンプルな表現を知りたいと思っています。

ちなみに、定義した関数は以下のようなものです:

[code]

    function mintfile_path {
        ( # execute inside subshell to restore working directories
            while : # infinite loop
            do
                local dir=$(pwd)
                local file_path="$dir/Mintfile"
                
                if [[ -f $file_path ]]
                then
                    echo $file_path
                    break
                fi
                
                if [[ $dir == "/" ]]
                then
                    break
                fi
                
                cd ..
            done
        )
    }
    
[/code]

2023-04-22 土曜日 追記:

本当はcdしたりサブシェルを使ったりしたくないので、dirnameを使って書き直してみました。

[code]

    function mintfile_path() {
        local dir=$(pwd)
        while : # infinite loop
        do
            local file_path="$dir/Mintfile"
    
            if [[ -f $file_path ]]
            then
                echo $file_path
                return
            fi
    
            if [[ $dir == "/" ]]
            then
                break
            fi
    
            dir=$(dirname $dir)
        done
    }
    
[/code]


CC BY-SA 4.0
2023-04-18T14:21:24.980
94565
2023-05-11T13:22:02.837
2023-05-11T13:22:02.837
19349
19349
question
unix zsh shell
祖先ディレクトリにあるファイル (Mintfile) を見つけてパスを取得したい


> 本当はcdしたりサブシェルを使ったりしたくない
[code]

    function mintfile_path {
      local dir="$PWD"; [ "$dir" = '/' ] && dir=''
      while :
      do
        [ -f "${dir}/Mintfile" ] && { echo "${dir}/Mintfile"; return; }
        [ -z "$dir" ] && return;
        dir="${dir%/*}"
      done
    }
    
[/code]


CC BY-SA 4.0
2023-04-18T15:37:17.980
94567
2023-04-22T06:32:40.287
2023-04-22T06:32:40.287
47127
47127
94565
answer