CD'yi belirli bir klasöre kadar yukarı kaldırın


16

Magento'da çok iş yapıyorum ve birlikte çalıştığım birçok insan da var ve yazmak zorunda kalıyorum:

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

Sadece kök 'httpdocs' klasöründen hala birkaç dizin bulmak için, bu yüzden bu sahte kodu izleyen bir komut dosyası yapmaya çalışıyorum:

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

Oldukça basit görünüyor, geçerli çalışma dizininin son bölümünün httpdocs olup olmadığını kontrol etmek için bir çeşit grep yapmak zorunda olduğumu varsayıyorum, eğer doğru olana kadar bir seviyeye çıkmaya devam etmiyorlar.

Bunun için bash öğrenmeye bakıyordum, ancak orada zaten benzer olan bir şey olmalı gibi görünüyor ve sözdizimi beni sonuna kadar şaşırtıyor.

Yanıtlar:


8

Bu bir komut dosyası değil kabuk işlevi olmalıdır , çünkü komut dosyası yeni bir kabukta yürütülür (ve bu nedenle orijinal kabuğun dizinini değiştiremez).

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

Tabii ki işlevi istediğiniz gibi adlandırabilirsiniz.

Bazı açıklamalar: İlk test ( $PWD != '/'), cdrootbir httpdocs klasörünün içinde olmadığınızda yapmanız durumunda bir arıza güvenliğidir . Köke ulaştığınızda duracaktır.

İkinci test ( ${PWD##*/} != 'httpdocs') biraz daha karmaşıktır. $PWDgeçerli dizinin yolunu içeren bir değişkendir. ${PWD##*/}son eğik çizgiye kadar her şeyi düzeltir.


Bu yinelemenin dezavantajı, cd -daha sonra bulunduğunuz yere geri dönmek için daha sonra yapma yeteneğinizi kaybetmenizdir .
Ezequiel Muns

27

uptoGeçerli yoldaki herhangi bir dizine adıyla gitmenizi sağlayan .bashrc adında bir işlevim var:

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

Ayrıca sekme tuşuna bastığımda geçerli dizin adları ve tamamlama verir, böylece bu işlev için tamamlama var:

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

Ayrıca jd, geçerli geçerli altındaki herhangi bir dizine atlamak için izin veren başka bir işlevi var :

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

Misal:

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

İçin bir takma ad da ekleyebilirsiniz upto httpdocs.
cjm

@ drogbane: jdHer durumda işe yaramıyor gibi görünüyor, nasıl çalıştığını açıklar mısınız?
Cesar

@ Sezar globstar ( **) kullanır . Bu özelliği bash kabuğunuzda etkinleştirmek için kullanın shopt -s globstar.
dogbane

2
Bu çok zekice yapıldı, keşke iki kez oy verebilsem.
Şubat'taki çöküş

1
Bu jdişleve dinamik bir tarama algılama ve etkinleştirme ekledim , bkz. Gist.github.com/Rob--W/5888648 . Sadece Bash 4.2.45 ile test ettim, bu yüzden YMMV.
Rob W

5

.bashrcAklınıza gelebilecek en basit bash işlevi (basit çünkü döngüler veya harici işlemler kullanmaz):

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

Bu, Desen değiştirmeyi kullanır sonra her yerine parametre genişleme /httpdocs/olarak $PWD'/ httpdocs' ile. Çok dağınık görünüyor, çünkü onları bash genişleme sözdizimindeki ileri eğik çizgilerden ayırmak için yoldaki eğik çizgilerden kaçmalıyız. Ayrıca, yedek dizede eğik çizgilerden kaçmayın, bu nedenle tutarsız görünüyor.

Yoksa /httpdocs/Geçerli yolda değişiklik gerçekleştirilmez ve yalnızca geçerli dizine geçer.

Örneğin ikame yerini alacak /a/b/c/httpdocs/e/f/golan/a/b/c/httpdocs ve cdbu dizine.

Bir alt işlem üst öğesinin geçerli dizinini değiştiremediğinden, işlevin geçerli kabuk ortamınızda (işlev veya takma ad olarak) olması gerekir. Bu yüzden bunu .bashrcbir kabuk betiğine değil, kendinize koymayı söylüyorum .


Bu arada, bunun sizi hiyerarşide olabildiğince yükseğe çıkaracağından bahsetmeye değer (muhtemelen en yararlı kullanım örneği).
İbrahim

3

Ayrıca profilinize böyle bir şey koyabilirsiniz:

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

Sadece yazmanız cdhsizi httpdocsmevcut yolunuzdaki en üstteki dizine götürecektir .


2

Sorununuzu tamamen ele almaz, ancak cd ../../../../../../biraz tasarruf etmenizi sağlar . Bunu burada bilinmeyen kullanıcının yayınından ödünç aldım .


yukarı N

dizin dizininde N dizinleri yukarı atla

Yazmak yerine

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

sadece yazıyorsun

up 4

ve bir

cd -    

seni geri getirecek

Kullanmak için işlevi .bashrc'nize koyun.

# (c) 2007 stefan w. GPLv3          
function up {
ups=""
for i in $(seq 1 $1)
do
        ups=$ups"../"
done
cd $ups
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.