特定のフォルダーまでCDをバッシュアップする


16

私はMagentoで多くの仕事をしているので、一緒に仕事をしている多くの人たちと同じように入力しなければなりません。

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

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

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

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

私はこのためにbashを学ぶことを検討してきましたが、すでに似たようなものがすでに存在している必要があるように思われます。

回答:


8

これがなければならないシェル機能スクリプトは、(元のシェルのディレクトリを変更することはできませんので、と)新しいシェルで実行されるため、スクリプトではありません。

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

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

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

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


この反復的な方法のマイナス面は、cd -後で自分がいた場所に戻るための能力を失うことです。
エゼキエルマン

27

upto.bashrcで呼び出される関数を使用すると、現在のパス上の任意のディレクトリに名前で移動できます。

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] $ 

のエイリアスを追加することもできupto httpdocsます。
cjm

@drogbane:jdすべての場合に機能するとは限りません。どのように機能するのか説明していただけますか?
シーザー

@Cesarはglobstar(**)を使用します。bashシェルでこの機能を有効にするには、を使用しますshopt -s globstar
ドッグベイン

2
これは非常に見事に行われています。
ドループ

1
jd関数に動的なショップ検出とアクティベーションを含めました。gist.github.com/ Rob--W / 5888648を参照してください。Bash 4.2.45でしかテストしていませんので、YMMVです。
ロブW

5

.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、シェルスクリプトではなく、あなたにそれを置くと言う理由です。


ちなみに、これは可能な限り階層の最上位に移動することを言及する価値があります(とにかくおそらく最も有用なユースケースです)。
イブラヒム

3

プロフィールに次のようなものを入れることもできます。

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

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


2

それはあなたの問題を完全に解決するわけではありませんがcd ../../../../../../、少しやることを節約します。ここでユーザー不明の投稿からこれを借りまし


アップ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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.