前/次の兄弟ディレクトリにCDを移動するには?

前/次の兄弟ディレクトリにCDを移動するには?

私はしばしばこのようなプロジェクトディレクトリのレイアウトを持っています。

project
`-- component-a
|   `-- files...
`-- component-b
|   `-- files...
`-- component-c
    `-- files...

component私は通常、ディレクトリの1つで作業します。ディレクトリにファイルがあるためです。シェルに戻るときは、通常兄弟ディレクトリに移動します。特に、各コンポーネントにスクリプトできない変更を適用する必要がある場合は、さらにそうです。このような場合には、私が働く前の兄弟や次の兄弟にも興味がありません。

コマンドを定義するprevか、next単にcd前または次のディレクトリに(アルファベット順にまたはその他に)移動できますか?cd ../com<TAB><Arrow keys>常にタイピングするのがやや昔ながらになっているからです。

ベストアンサー1

Commandlinefuソリューションを使用しないでくださいもう一つの答え:安全ではなく非効率的です。代わりにbash。これを継続的に作成するには組み込まれていて.bashrc簡単なので、グローバルシーケンスを使用しています。一般的にグローバル注文はいただし、ほとんどのロケールではアルファベット順にソートされます。移動する次または前のディレクトリがない場合は、エラーメッセージが表示されます。具体的には、ルートディレクトリでまたはnext試してみるとエラーが表示されます。prev/

## bash and zsh only!
# functions to cd to the next or previous sibling directory, in glob order

prev () {
    # default to current directory if no previous
    local prevdir="./"
    local cwd=${PWD##*/}
    if [[ -z $cwd ]]; then
        # $PWD must be /
        echo 'No previous directory.' >&2
        return 1
    fi
    for x in ../*/; do
        if [[ ${x#../} == ${cwd}/ ]]; then
            # found cwd
            if [[ $prevdir == ./ ]]; then
                echo 'No previous directory.' >&2
                return 1
            fi
            cd "$prevdir"
            return
        fi
        if [[ -d $x ]]; then
            prevdir=$x
        fi
    done
    # Should never get here.
    echo 'Directory not changed.' >&2
    return 1
}

next () {
    local foundcwd=
    local cwd=${PWD##*/}
    if [[ -z $cwd ]]; then
        # $PWD must be /
        echo 'No next directory.' >&2
        return 1
    fi
    for x in ../*/; do
        if [[ -n $foundcwd ]]; then
            if [[ -d $x ]]; then
                cd "$x"
                return
            fi
        elif [[ ${x#../} == ${cwd}/ ]]; then
            foundcwd=1
        fi
    done
    echo 'No next directory.' >&2
    return 1
}

¹可能なすべてのディレクトリ名を処理するわけではありません。 出力を解析することはls決して安全ではありません。

²cd非常に効率的である必要はありませんが、6つのプロセスはやや過度です。

おすすめ記事