私はMagentoで多くの仕事をしているので、一緒に仕事をしている人の多くもそうであり、入力するのが面倒です:
cd ../../../../../../
ルート 'httpdocs'フォルダーからまだいくつかのディレクトリを見つけているだけなので、この疑似コードに続くスクリプトを作成しようとしています。
while lowest level directory != httpdocs
cd ../
end while;
かなり単純に思えますが、現在の作業ディレクトリの最後の部分がhttpdocsであるかどうかを確認するために何らかの形でgrepを実行する必要があると想定しています。
私はこれについてbashの学習を検討してきましたが、同じようなものはすでにそこにある必要があるように思われ、構文は私を最後まで困惑させます。
スクリプトは新しいシェルで実行されるため(つまり、元のシェルのディレクトリを変更できないため)、これは シェル関数 である必要があります。
function cdroot()
{
while [[ $PWD != '/' && ${PWD##*/} != 'httpdocs' ]]; do cd ..; done
}
もちろん、関数には好きな名前を付けることができます。
いくつかの説明:最初のテスト($PWD != '/'
)は、httpdocsフォルダ内にいないときにcdroot
を実行した場合のフェイルセーフです。ルートに到達すると停止します。
2番目のテスト(${PWD##*/} != 'httpdocs'
)はもう少し複雑です。 $PWD
は、現在のディレクトリのパスを含む変数です。 ${PWD##*/}
は、最後のスラッシュまでのすべてを切り取ります。
私の.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] $
私が考えることができる.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
に置くと言う理由です。
次のようなものをプロファイルに追加することもできます。
alias cdh='cd $(echo $PWD | sed -e "s/\(.*\/httpdocs\)\/.*/\1/")'
cdh
と入力するだけで、現在のパスの最上位のhttpdocs
ディレクトリに移動します。
問題を完全に解決するわけではありませんが、cd ../../../../../../
少し。 ser unknown の投稿 here からこれを借りました。
入力する代わりに
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
}