パス名の前の単語を変更してディレクトリを変更します。

パス名の前の単語を変更してディレクトリを変更します。

別の下位レベルの親を使用してほぼ同じパスに変更するにはどうすればよいですか?たとえば、作業中で同じパスに移動する必要がある場合は、入力せずにそこに行くことができますか?もちろんエレガントでぎこちない解決策もあります。~/foobar/foo/data/images/2020/01/14/0001/barfoocd ~/foobar/bar/data/images/2020/01/14/0001/

ベストアンサー1

kshなどの一部のシェルでは、zsh現在のディレクトリのパス名の最初のエントリをに変更して、指定されたcd word1 word2ディレクトリを変更します。word1word2

たとえば、zshシェルでは次のようになります。

$ pwd
/usr/local/sbin
$ cd sbin bin
/usr/local/bin
$

${variable/pattern/replacement}元の非標準パラメータ置換をサポートする他のシェルでは、ディレクトリを生成するパス名をksh93使用して次のように変更できます。${PWD/word1/word2}

$ pwd
/usr/local/sbin
$ cd "${PWD/sbin/bin}"
$ pwd
/usr/local/bin

これらのシェル(bash例:)では、cd次のように2つの引数を合計として扱う単純な関数を直接作成することもできます。kshzsh

cd () {
    if [ "$#" -eq 2 ] && [[ $1 != -* ]]; then
        command cd -- "${PWD/$1/$2}" &&
        printf 'New wd: %s\n' "$PWD"
    else
        command cd "$@"
    fi
}

[ "$#" -eq 2 ]特別なアクションがトリガーされなければならない時期を検出しますcd(コマンドライン引数が正確に2つある場合)。しかし、私たちがテストする[[ $1 != -* ]]のはいいえでオプションを使用すると、特別な動作がトリガーされますcd。関数内で置換を使用すると、command cd関数が再帰的に呼び出されるのを防ぎます。cd

テストbash:

$ cd /usr/local/sbin
$ cd sbin bin
New wd: /usr/local/bin
$ cd local ''
New wd: /usr/bin
$ cd bin sbin
New wd: /usr/sbin
$ cd sbin local/sbin
New wd: /usr/local/sbin
$ cd '*/' /
New wd: /sbin

最後のコマンドは、/最後まで一致するパターンに置き換えられます。スキーマを参照する必要があります。パターンを抑制し、常に最初の引数を単語として扱うには、関数でcommand cd "${PWD/"$1"/$2}"(引用符を参照)を使用します$1

さらに、完全なディレクトリ名にのみ影響を与えるように置き換えるには、を使用しますcommand cd "${PWD/"/$1/"/"/$2/"}"。 2つの引数の前後に人為的に挿入すると、/ディレクトリ名の部分文字列の一致が防止されますが、動作方法と互換性がなくなり、許可されなくなりますzsh。最後にkshはないので、ディレクトリパスの最後の部分で置き換えを行う必要があります(追加の「ヘルプ」が邪魔になる前にのみ役立つことができます)。/

これ会議ただし、cd foo bar質問の例を使用してください。それ以外の場合は、withなどの他の方法fooで一致しないようにする必要があります。foobarcd foo/ bar/

おすすめ記事