cwdパスの一部であるサブディレクトリをどのように参照しますか?

cwdパスの一部であるサブディレクトリをどのように参照しますか?

すべてのレベルの深さにネストされたcwdに沿ったパスを参照する一般的な方法はありますか?これはほぼリバース相対パスルックアップと同じです。

たとえば、

$ pwd
/Users/somebody/foo/bar/baz

$ echo /[3] <-- 3rd directory from / in current path
/Users/somebody/foo

$ echo ~/[1]   <-- 1 directory from ~ in current path
~/foo

答え1

次の機能を次の項目に追加します.bashrc

parent() {
        local count
        local arg

        count=$(($1+1))
        if [ "$2" = "" ]
        then
                arg="$PWD"
        else
                arg="$2"
                if [[ $arg != /* ]]
                then
                        printf 'Warning: "%s" does not begin with "/".\n' "$arg"
                fi
        fi
        cut -d/ -f1-"$count" <<< "$arg"
}

tparent() {                                     # The ‘t’ stands for “tilde”.
        local count
        local arg
        local home

        count=$(($1+1))
        if [ "$2" = "" ]
        then
                arg="$PWD"
        else
                arg="$2"
        fi
        if [ "$3" = "" ]
        then
                home="$HOME"
        else
                home="$3"
        fi
        if [[ $home != /* ]]
        then
                printf 'Warning: "%s" does not begin with "/".\n' "$home"
        fi
        if [[ $arg/ != $home/* ]]
        then
                printf 'Error: "%s" does not begin with "%s".\n' "$arg" "$home"
                return 1
        fi
        printf '%s' "~${arg/$home}" | cut -d/ -f1-"$count"
}

最初の抽出に使用されます。cut -d/ -f1-numberNパス名のコンポーネントです。  number〜しなければならないN最初のフィールドの前の空の文字列が最初のフィールド/と見なされるため、+1 です。

使用法:

$ pwd
/home/gman/stack/JW

$ parent 3
/home/gman/stack

$ tparent 1
~/stack

これはスペースとタブのあるパスを処理できますが、改行文字は処理できません。

関連情報