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

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

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

答え2

それは簡単です。

cd "$( echo "$PWD" | sed -e 's%/foo/%/bar/%' )"

sedコマンドの後に続く文字をs区切り文字として使用します。

答え3

CLI では、次の例のように修飾子を使用できます。

$ mkdir -p foobar/foo/data/images/2020/01/14/0001/
mkdir: created directory 'foobar'
mkdir: created directory 'foobar/foo'
mkdir: created directory 'foobar/foo/data'
mkdir: created directory 'foobar/foo/data/images'
mkdir: created directory 'foobar/foo/data/images/2020'
mkdir: created directory 'foobar/foo/data/images/2020/01'
mkdir: created directory 'foobar/foo/data/images/2020/01/14'
mkdir: created directory 'foobar/foo/data/images/2020/01/14/0001/'
$ ^bar/foo^bar/bar^
mkdir -p foobar/bar/data/images/2020/01/14/0001/
mkdir: created directory 'foobar/bar'
mkdir: created directory 'foobar/bar/data'
mkdir: created directory 'foobar/bar/data/images'
mkdir: created directory 'foobar/bar/data/images/2020'
mkdir: created directory 'foobar/bar/data/images/2020/01'
mkdir: created directory 'foobar/bar/data/images/2020/01/14'
mkdir: created directory 'foobar/bar/data/images/2020/01/14/0001/'

説明する:

最初のコマンドは、foobarで始まるネストしたディレクトリを作成します。 2番目のコマンドは^修飾子を使用して、前のコマンドの文字列を新しい文字列に置き換えます。次のように入力するとミスしやすいです。

^foo^bar^

ただし、これによりコマンドは次のように変更されます。

mkdir -p barbar/foo/data/images/2020/01/14/0001/

これは先行するfooにも影響を与えるため、これを防ぐために、予想される文字列の前後にいくつかの文字を使用できます。

この例ではmkdirを使用しましたが、cdも似ています。 HTH。

答え4

時にはマウスを使用する方が簡単です。、グラフィックデスクトップで良い端末エミュレータを使用しているとします。または、screen最新バージョンでは、キーボードコントロールを使用していくつかのテキストをコピー/貼り付けることができます。

$ pwd
/some/long/path

そのパスをコマンドにコピーして貼り付けますcd。つまり、パスをダブルクリックしてフルパスを選択するか、スペースがある場合はパスをダブルクリックしてフルラインを取得します。その場合は、貼り付ける前に一重引用符を入力してください。

次に、シェルの行編集キーを使用して、Bashemacsモードで前の部分を編集します。

  • ctrl-a カーソルを行の先頭に移動します。
  • 正しいコンポーネントが見つかるまで、ctrl-右矢印(またはalt-f)を数回押して単語単位で進めます。
  • alt-d または alt-backspace は単語全体を前後に削除します。
  • 代替項目(タブ補完を使用)を入力してEnterキーを押します。

あなたが何かをたどるなら、それはcdただの命令であり、破壊的なことはしません。

関連情報