ディレクトリの変更(cd)、ただしパスの一部のみを置き換える


14

可能かどうかはわかりませんが、AIXを使用していた昔から、パスのどの部分を他の何かに置き換える必要があるかを言うだけでパスを変更できたことを覚えているようです。たとえば、2つのパスがあるとします。

/etc/application-2.0.1/options/default

そして

/etc/application-1.0.8/options/default

次のようなコマンドを使用して、フォルダ1から2に切り替えることができます。

cd /2.0.1/1.0.8/

これは、パス内の文字列2.0.1をに置き換えます1.0.8。明らかに、これは今ではうまくいきません。しかし、これを行う方法はありますか?

回答:


11

zshをシェルとして使用する場合は、単に入力できますcd 1.0.8 2.0.1


これは私にとって最良の選択肢のようです。今それをインストールする方法を探しています:)
nathanvda

1
sudo apt-get install zsh
koushik

1
RandomMonkeyの答えは、Bashの「cd」ビルトイン内で完全なパス置換機能を可能にします。
kmarsh

9

これは、ubuntu 10.04のbashで動作するはずですcd ${PWD/old/new}。基本的に、これは現在の作業ディレクトリで最初に出現するものをoldに置き換えます。以下の2つの例。new

例1

ing02741@hoster:~$ cd /home/ing02741/Videos/
ing02741@hoster:~/Videos$ cd ${PWD/ing02741/koushik}
ing02741@hoster:/home/koushik/Videos$ 

例2

ing02741@hoster:~/src/cdtest$ mkdir dir-v1.0.1 dir-v2.2.2 dir-v3.0.7
ing02741@hoster:~/src/cdtest$ mkdir dir-v1.0.1/ind dir-v2.2.2/ind dir-v3.0.7/ind
ing02741@hoster:~/src/cdtest$ cd dir-v1.0.1/ind/
ing02741@hoster:~/src/cdtest/dir-v1.0.1/ind$ cd ${PWD/1.0.1/2.2.2}
ing02741@hoster:~/src/cdtest/dir-v2.2.2/ind$ 

上記のsepp2kのアイデアを借りて、次のような関数を作成できます。

function mycd { cd ${PWD/$1/$2} }

そして、mycd 2.0.1 1.0.8スイッチのようなものを使用します。


1
これは1/2の方法です。RandomMonkeyの答えを見ると、ビルトインのBash Cd内ですべての機能が使用可能であることがわかります。
kmarsh

8

私は自分でこの機能を使用しました(そして見逃しました)。使用している* nixのフレーバーやリリースによって異なります。bashを使用する場合、組み込みCDを拡張してこの機能を含める便利な方法を次に示します。これを.bashrcに入れます(または、テストしてbashシェルに貼り付けてEnterキーを押します)。

function cd() { if [ $# -eq 2 ]; then builtin cd ${PWD/$1/$2}; else builtin cd $1; fi }

7

おそらく歴史の拡大を覚えているでしょう。AIXのシェルで何が利用可能かはわかりませんが、bashでこれを行う1つの方法は^2.0.1^1.0.8です。

履歴展開は、bashやzshなどの強力なコマンドライン編集機能を備えたシェルではあまり有用ではありません。矢印キーを使用して前のコマンドを呼び出し、Alt+ .を使用して前のコマンドの最後の単語を挿入できます(2回押すと、その前のコマンドに到達します)。


histverifyオプションshoptがオンになっている場合は、Enterキーを2回押すだけです。
追って通知があるまで一時停止します。

@Dennis:おかげで、--norcテスト時に忘れていました。
ジル「SO-悪であるのをやめる」

3

viファンの場合、シェルでviモードを有効にし(bash set -o viなど)、viのコマンドモードを使用できます。

または、クレイジーな履歴展開を行うこともできます(zshで、おそらくbashでもテストされます)。

$ cd /etc/application-1.0.8/options/default
cd: no such file or directory: /etc/application-1.0.8/options/default

$ !!:s/1.0.8/2.0.1/
cd /etc/application-2.0.1/options/default
cd: no such file or directory: /etc/application-2.0.1/options/default

ところで、bashでテストし、そこでも動作します。
maxschlepzig

3
cd `pwd | sed 's/2\.0\.1/1\.0\.8/'`

しかし、これはあまりきれいではありません。関数に入れることで、少しきれいにできます:

function mycd { cd `pwd | sed s$1` }

そして、次のように呼び出します:

mycd '/2\.0\.1/1.0.8/'

ただし、まだドットをエスケープする必要がありますが、少し考えればこれも回避できると確信しています。


置換の右側にあるドットをエスケープする必要はありません。ほとんどの場合、同様の名前のフォルダーがたくさんない限り、左側のドットをエスケープしないことも無害です。
狂った


2

確実に-P|-L|-作業するには、次を使用します。

function cd () {
    typeset arg=
    case $1 in -|-L|-P) arg=$1 ; shift ;; esac
    [ $# -gt 1 ] && {
        builtin cd $arg "${PWD/$1/$2}"
    } || {
        builtin cd $arg "$@"
    }
}

1

AIXについてはわかりませんが、これは私が管理に使用していたSolarisボックスの古いKornシェルトリックとして覚えています。例では、次のコマンドを入力します。

cd 2.0.1 1.0.8

詳細はこちら


これは私にとってはうまくいきませんでした:ubuntu 10.04、bash "GNU bash、バージョン4.1.5(1)-release(i486-pc-linux-gnu)"、私は次のコマンドを試しました:2048 cd 2049 cd〜/ src / local -ubuntu-patches / cdtest / dir-v1.0.9 / gnome-control-center-2.30.1 / capplets / network / 2050 cd dir-v1.2.9 dir-v1.0.9 / home / ing02741 / src / local-ubuntu- patch / cdtest / dir-v1.2.9 / gnome-control-center-2.30.1 / capplets / networkは有効なパスです。
koushik

@koushik:彼はKornシェルトリックだと書いています。bashを使用しています。bash!= korn。Ubuntuでは、kshはパッケージ 'ksh'を介して利用できます。
maxschlepzig

opps、私の悪い。すみません、私はこれを見落としていました。@maxschlepzig-指摘してくれてありがとう。
koushik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.