web-dev-qa-db-ja.com

CDを特定のフォルダに移動する

私はMagentoで多くの仕事をしているので、一緒に仕事をしている人の多くもそうであり、入力するのが面倒です:

cd ../../../../../../

ルート 'httpdocs'フォルダーからまだいくつかのディレクトリを見つけているだけなので、この疑似コードに続くスクリプトを作成しようとしています。

while lowest level directory != httpdocs
    cd ../
end while;

かなり単純に思えますが、現在の作業ディレクトリの最後の部分がhttpdocsであるかどうかを確認するために何らかの形でgrepを実行する必要があると想定しています。

私はこれについてbashの学習を検討してきましたが、同じようなものはすでにそこにある必要があるように思われ、構文は私を最後まで困惑させます。

16
user652650

スクリプトは新しいシェルで実行されるため(つまり、元のシェルのディレクトリを変更できないため)、これは シェル関数 である必要があります。

function cdroot()
{
  while [[ $PWD != '/' && ${PWD##*/} != 'httpdocs' ]]; do cd ..; done
}

もちろん、関数には好きな名前を付けることができます。

いくつかの説明:最初のテスト($PWD != '/')は、httpdocsフォルダ内にいないときにcdrootを実行した場合のフェイルセーフです。ルートに到達すると停止します。

2番目のテスト(${PWD##*/} != 'httpdocs')はもう少し複雑です。 $PWD は、現在のディレクトリのパスを含む変数です。 ${PWD##*/} は、最後のスラッシュまでのすべてを切り取ります。

8
cjm

私の.bashrcにはuptoという関数があり、現在のパス上の任意のディレクトリに名前で移動できます。

upto ()
{
    if [ -z "$1" ]; then
        return
    fi
    local upto=$1
    cd "${PWD/\/$upto\/*//$upto}"
}

この関数の補完もあるので、タブを押すと、有効なディレクトリ名と補完が得られます。

_upto()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local d=${PWD//\//\ }
    COMPREPLY=( $( compgen -W "$d" -- "$cur" ) )
}
complete -F _upto upto

さらに、現在のディレクトリの下にある任意のディレクトリにジャンプできるようにする別の関数jdがあります。

jd(){
    if [ -z "$1" ]; then
        echo "Usage: jd [directory]";
        return 1
    else
        cd **"/$1"
    fi
}

例:

[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto h[TAB][TAB]
habitat       hippopotamus
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto hippopotamus
[/www/public_html/animals/hippopotamus] $ jd images
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ 
27
dogbane

私が考えることができる.bashrcに入れることができる最も単純なbash関数は、次のとおりです(ループまたは外部プロセスを使用しないため単純です)。

cdup() {
    cd "${PWD/\/httpdocs\/*//httpdocs}"
}

これはパターン置換パラメータ展開を使用して、/httpdocs/$PWDの後のすべてを `/ httpdocs 'に置き換えます。パスのスラッシュをエスケープして、bash拡張構文のスラッシュと区別する必要があるため、非常に複雑に見えます。さらに、置換文字列でスラッシュをエスケープしないため、一貫性がないように見えます。

現在のパスに/httpdocs/がない場合、置換は実行されず、現在のディレクトリに変更されるだけです。

たとえば、置換により/a/b/c/httpdocs/e/f/g/a/b/c/httpdocsおよびcdでそのディレクトリに置き換えられます。

子プロセスは親の現在のディレクトリを変更できないため、関数は現在のシェル環境に(関数またはエイリアスとして)存在する必要があります。これが、シェルスクリプトではなく.bashrcに置くと言う理由です。

6
camh

次のようなものをプロファイルに追加することもできます。

alias cdh='cd $(echo $PWD | sed -e "s/\(.*\/httpdocs\)\/.*/\1/")'

cdhと入力するだけで、現在のパスの最上位のhttpdocsディレクトリに移動します。

3
Mat

問題を完全に解決するわけではありませんが、cd ../../../../../../少し。 ser unknown の投稿 here からこれを借りました。


アップN

ディレクトリツリーでN個のディレクトリを上にジャンプ

入力する代わりに

cd ../../../..

あなたはただタイプする

up 4

cd -    

あなたを連れ戻す

関数を.bashrcに入れて使用します。

# (c) 2007 stefan w. GPLv3          
function up {
ups=""
for i in $(seq 1 $1)
do
        ups=$ups"../"
done
cd $ups
}
2
boehj