サブディレクトリを一覧表示せずにparent1/suba/subからparent2/suba/subにCDを移動するには?

サブディレクトリを一覧表示せずにparent1/suba/subからparent2/suba/subにCDを移動するには?

その下に同じファイル構造を持つ複数の親ディレクトリがあります。

例:

parent1/suba/subb/
parent2/suba/subb/

私はそこにいる間そのようなことをしないparent1/suba/subbことに変わりたかったです。すべてのサブディレクトリとリストを一覧表示せずにこれを行うにはどうすればよいですか?parent2/suba/subbcd ../../../parent2/suba/subb../

答え1

あなたはそれを使用することができますPWD変えるそしてパラメータ拡張現在のディレクトリにテキスト変換をすばやく適用するように設定されています。

cd ${PWD/parent1/parent2}

これはパスコンポーネントである必要はなく、任意の部分文字列にすることができます。たとえば、パスが実際にparent1aで、parent2パスの左側に文字がなくなった場合は、この方法を使用できます。検索文字列には複数のパスコンポーネントを含めることができますが、スラッシュをエスケープする必要があります。たとえば、fromからtoに移動するには、を使用します。もっと正確に言えば、その部分がシェルワイルドカードパターンなので。1cd ${PWD/1/2}~/checkout/trunk/doc/frobnicator/widget~/checkout/bugfix/src/frobnicator/widgetcd ${PWD/trunk\/doc/bugfix/src}parent1cd ${PWD/tr*c/bugfix/src}

存在する扱いにくい、より短い構文を使用できますcd parent1 parent2。同様に、パス内のすべての部分文字列を置き換えることができます(ここではワイルドカードパターンではなく正確に部分文字列です)。

Bashでも同様の機能を実装できます。

cd () {
  local options
  options=()
  while [[ $1 = -[!-]* ]]; do options+=("$1"); shift; done
  if (($# == 2)); then
    builtin cd "${options[@]}" "${PWD/$1/$2}"
  else
    builtin cd "${options[@]}" "$@"
  fi
}

Zshは2番目のパラメータの完成機能を提供します。これをBashで実装することは、読者の練習課題として残されています。

答え2

最初

parent1またはparent2がディレクトリパスの別の場所にある場合。

cd $(pwd | sed -e s:/parent1/:/parent2/: )

だから切り替えるとただこれら2つのディレクトリから

cd -
  • その後、ジャンプしたディレクトリに戻ります。

答え3

set場所の配列にターゲットディレクトリを追加できます。たとえば、

cd ~
mkdir dirtest
cd dirtest
i=0
until [ "$((i=$i+1))" -gt 9 ] 
do mkdir -p parent"$i"/suba/subb
done

これにより、質問の例をモデルにした親1-9を含むツリーが作成されます。私は今できる:

set -- "$PWD/parent"[0-9]"/suba/subb"
cd "$1"; pwd

出力

/home/mikeserv/dirtest/parent1/suba/subb

...[0-9]グローバル拡張はロケールによって順序付けされているため...

cd "$5"; pwd

/home/mikeserv/dirtest/parent5/suba/subb

cd "$9"; pwd

/home/mikeserv/dirtest/parent9/suba/subb

... 0-9。ただし、シェルはソートされない可能性がありますトップ10後ろに父9、後でソートします。親1。ただし、並べ替えることができます。トップ10後ろに親09、しかし。 2桁の数字に達したら、${parameter expansion}数字の周りに中括弧を使用して参照を明示的"${10}""$1"作成する必要があります0

答え4

.bahsrc私のものには(cd-edit)という機能があります。cd-e

cd-e (){  PWD=`echo "$PWD" | vipe +'normal $'`;  cd "$PWD"; }

vimカーソルが最後にある現在のディレクトリを開きます(私は最後で編集する傾向があるため)。

( Vipe は の一部であるmoreutilsか、次のとおりです。

#!/bin/sh
set -e
trap 'rm -f "$tmp"' exit
tmp=`mktemp`
cat > "$tmp"
</dev/tty vi "$@" "$tmp" >/dev/tty
cat "$tmp"

)

関連情報