
その下に同じファイル構造を持つ複数の親ディレクトリがあります。
例:
parent1/suba/subb/
parent2/suba/subb/
私はそこにいる間そのようなことをしないparent1/suba/subb
ことに変わりたかったです。すべてのサブディレクトリとリストを一覧表示せずにこれを行うにはどうすればよいですか?parent2/suba/subb
cd ../../../parent2/suba/subb
../
答え1
あなたはそれを使用することができますPWD
変えるそしてパラメータ拡張現在のディレクトリにテキスト変換をすばやく適用するように設定されています。
cd ${PWD/parent1/parent2}
これはパスコンポーネントである必要はなく、任意の部分文字列にすることができます。たとえば、パスが実際にparent1
aで、parent2
パスの左側に文字がなくなった場合は、この方法を使用できます。検索文字列には複数のパスコンポーネントを含めることができますが、スラッシュをエスケープする必要があります。たとえば、fromからtoに移動するには、を使用します。もっと正確に言えば、その部分がシェルワイルドカードパターンなので。1
cd ${PWD/1/2}
~/checkout/trunk/doc/frobnicator/widget
~/checkout/bugfix/src/frobnicator/widget
cd ${PWD/trunk\/doc/bugfix/src}
parent1
cd ${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"
)