別の下位レベルの親を使用してほぼ同じパスに変更するにはどうすればよいですか?たとえば、作業中で同じパスに移動する必要がある場合は、入力せずにそこに行くことができますか?もちろんエレガントでぎこちない解決策もあります。~/foobar/foo/data/images/2020/01/14/0001/
bar
foo
cd ~/foobar/bar/data/images/2020/01/14/0001/
ベストアンサー1
ksh
などの一部のシェルでは、zsh
現在のディレクトリのパス名の最初のエントリをに変更して、指定されたcd word1 word2
ディレクトリを変更します。word1
word2
たとえば、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つの引数を合計として扱う単純な関数を直接作成することもできます。ksh
zsh
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
で一致しないようにする必要があります。foobar
cd foo/ bar/