現在ツリーの特定の深さにあるディレクトリに移動するには?

現在ツリーの特定の深さにあるディレクトリに移動するには?

私は通常同じサーバー上の複数のフォルダ(dev1、、、および)でdev2作業します。dev3フォルダ構造は次のとおりです。

  • /var/www/html/dev1/a/b/c/d/e/f
  • /var/www/html/dev2/a/b/c/d/e/f
  • /var/www/html/dev3/a/b/c/d/e/f

c特定のフォルダ(またはdまたはeof)にいるときに/var/www/html/dev3/私を連れて行くコマンドはありますか/var/www/html/dev3/a

フォルダまたは/var/www/html/dev1/acde/var/www/html/dev1/

答え1

方法#1 - 相対CD

現在の位置から特定の深さに移動する最も簡単な方法は、次のコマンドを実行することです。

$ pwd
/Users/sammingolelli/adir/dev3/a/b/c/d/e/f

$ cd ../../../../..

$ pwd
/Users/sammingolelli/adir/dev3/a

方法 #2 - pushd/popd

これに加えて、pushdおよびをpopdスタックとして使用してFIFOまたはディレクトリに移動し、スタックから以前にプッシュされたディレクトリに戻るpushdときに通知するFIFOまたはディレクトリを維持することもできます。popd

はい
$ pwd
/Users/sammingolelli/adir/dev3/a
$ dirs
~/adir/dev3/a

$ pushd b/c/d/e/f/
~/adir/dev3/a/b/c/d/e/f ~/adir/dev3/a
$ pwd
/Users/sammingolelli/adir/dev3/a/b/c/d/e/f

$ popd
~/adir/dev3/a
$ pwd
/Users/sammingolelli/adir/dev3/a

方法 #3 - エイリアス

必要なタスクを実行するためにエイリアスを作成することもできます。この問題に対処する複数のQ&Aがすでにサイトにある場合、または@fastrizwaanの回答をご覧ください。

方法 #4 - CDPATH

この答えを見てください@スタッフ、このQ&Aについて: 端末でのクイックディレクトリのナビゲーション

さらに、ツールを使用しますか?

上記の2つの方法は、最も一般的に使用される移動方法です。もちろん、他のツールをナビゲーションツールとしてインストールすることもできます。これらのツールはこのサイトでたくさん議論されています。お気に入りの1つは、特定のディレクトリを「ブックマーク」し、短い名前にマッピングしてどこでも簡単に変更できるようにするブックマークツールです。

自動ジャンプ

私はこのQ&Aでそのようなツールの1つについて議論します。短いパスを作成するには?。ツールが呼び出されます。自動ジャンプ

他の人

次のタイトルのQ&Aに提案されているいくつかの異なる点があります。端末でのクイックディレクトリのナビゲーション

答え2

これは機能的な作業です。シェルがbashであると仮定すると、.bashrcこの機能は次にbashを起動するときに使用できます。

cdwww () {
}

何をすべきですか?注文でなければなりませんcd。現在のディレクトリへのパスは変数にありますPWD文字列処理そして他の構造。

/var/www/htmlたとえば、現在のディレクトリが下にある場合、次の関数は現在のディレクトリより1レベル上のディレクトリに移動します/var/www/html

cdwww () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    cd "${PWD%"$d"}"
  else
    echo 1>&2 "$0: not under a web root"
    return 3
  fi
}

この関数は他のサブディレクトリへのパスを許可することができます/var/www/html/dev*/a

cdwww () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    cd "${PWD%"$d"}/$1"
  else
    echo 1>&2 "$0: not under a web root"
    return 3
  fi
}

別の方法は、ディレクトリを変更するたびにターゲットディレクトリに変数を設定することです。次のコードは、chpwd現在のディレクトリが変更されるたびにこの関数が実行されるようにスケジュールします。

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    html_root="${PWD%"$d"}"
  else
    unset html_root
  fi
}

その後、次のものを使用できますcd $html_root(または$html_rootオンの場合shopt -s autocd)。

答え3

今、あなたの質問を理解します。

cd $(pwd|cut -c 1-18)/a

/var/www/html/dev1/aあなたが下や中にいるとき、dev1/var/www/html/dev2/aや中にいるときdev2などにあなたを連れて行きます。

cutここにハッキングがあるようです。18パスが変更されたら変更する必要がありますが、正規表現を使用するよりエレガントなソリューションを見つけることができませんでした。

答え4

存在するzsh

cd $PWD[1,(rn[5])/]

最初の文字でcd部分文字列を開始し、$PWD最初の文字の発生終わります。したがって、次のようになります。15/

1 2 3 4 5
/var/www/html/dev1/a/b/c/d/e/f

それでは一つになりますcd /var/www/html/dev1/

ヘルパー関数を作成できます。

cdd() cd $PWD[1,(rn:argv[1]:)/]

たとえば、引数として与えられたepth内でcd$PWDdcdd 5

関連情報