Birden fazla dizin seviyesine çıkmak için cd kullanma


36

Genellikle derinlemesine yuvalanmış klasörler (/ yol / to / proje / com / java / lang / neyse, vb.) İle sonuçlanan java projeleri ile uğraşıyorum ve bazen 4 dizin seviyesinden yukarı atlayabilmek istiyorum. Yazmak cd ../../../ .. bir acıdır, ve link etmek istemiyorum. Birden fazla dizin seviyesine çıkmanıza izin veren bir cd bayrağı var mı (kafamda cd -u 4 gibi bir şey olurdu)? Ne yazık ki, özellikle cd için herhangi bir man sayfası bulamıyorum, bunun yerine sadece işe yaramaz "builtins" sayfasını açıyorum.


1
Bash'ın değiştirildiği cd ...yerde '.' Sayısını yorumlamak yükselecek seviye sayısı olacaktır. Bu, farkında olmadığım bir çatışmaya neden olur mu?

Buraya MacOS için gelenler için yükleyebilir zshve Oh My Zshhangisine daha iyi bir alternatif olabilir bashve sonra cd ...olması gerektiği gibi (çoklu noktalar) yapabilirsiniz
Dominic

Yanıtlar:


29

Veya ... şunu dene: (yay Google)

..N kullanarak dizinde yukarı çıkın:

Aşağıdaki örnekte ..4, 4 dizin seviyesine, ..3, 3 dizin seviyesine, ..2, 2 dizin seviyesine çıkmak için kullanılır.

.Bash_profile dosyasına şu diğer adı ekleyin ve tekrar giriş yapın.

alias .. = "cd .."

alias ..2 = "cd ../ .."

alias ..3 = "cd ../../ .."

(vb)

Hack # 2'ye bakınız


10
Daha doğrusu takma adları kullanmak istiyorsunuz .., ...ve ....onlar yazmak için daha hızlı olarak değil, takma ad ilkesi elbette aynıdır.
Bernhard

1
@bernhard Herhangi bir çatışmaya yol açacağına inanmadığım için, hoş geldiniz demek istemezsiniz. Sadece olduğu gibi bıraktım çünkü web sitesinden alıntı yaptım.
cutrightjm

DOS için 4DOS.EXE kabuk da desteklenir cd ..., cd ....vb çok kullanışlı.
Alexios

27

Takma adlı basit bir fonksiyon:

function cd_up() {
  cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'

( ~/.bashrcHer durumda istiyorsanız, bunu tanımlayabilirsiniz ).

Kullanımı basit:

$ cd.. 10

Güzel! Benim için çalışıyor! Bash 4.3.11
Carlos Nunez

2
İyi cevap; Bunun, birden çok kez eval $(printf "cd ..;%.s" $(seq $1))olduğu gibi çözümlerden daha iyi olduğunu belirtmek isteyebilirsiniz cd, çünkü ~-aka $OLDPWD, bir ön dizinden ziyade çalışma dizininden çalışma dizinine ayarlanmıştır. PS - cd $(printf %.s../ $(seq "$1"))İsterseniz basitleştirir .
Toby Speight

10

Herhangi bir kuruluma ihtiyaç duymayan basit, düşük teknolojili bir çözüm. Ancak, yalnızca bash-style komut düzenleme ile kabukları çalışır .

  • tip cd ..
  • Up-arrow ReturnGerektiği kadar basın . İki parmağınızı kullanırsanız çok hızlı.

2
haha, fena bir cevap değil sanırım :)
joshmcode

8

Doğru cevabın 'cd + n' olduğu ve n'nin yukarı gitmek istediğin seviye olduğu ortaya çıktı. Çok kötü, bu hiçbir yerde belgelenmemiş!


16
en azından bash olarak çalışmaz.
HongboZhu

5
Debian ile birlikte 4.2.25 bash'te çalışmaz. Merak, ne * Nix ve / veya kabuk kullanıyorsunuz?
Alexios

Bash dirsargüman olarak [+ n] alan bir dahili denilen dosyaya eklenmiş nth tekil dizini basar pushd. Eğer varsa alias cdetmek pushd, o zaman bunu kullanabilirsiniz. Bununla birlikte, bunun teknik olarak OP'nin sorusuna bir cevap olmadığını, çünkü bunun benzersiz dizinlerle ilgisi olduğunu, yani aynı dizinlere geri döndüğünüzde siparişin zaman içinde karışıklığa uğradığını gösterir.
Brian Peterson

Evet, pushdve popdde bu işe yapabiliyor neden olan bir [+ n] seçeneğini alır. Ayrıca, kusurlu ve dolaylı olmasına rağmen, sanırım bu sorunun cevabı olarak kullanılabilir. Genellikle yakın zamanda üstünüzdeki dizinleri ziyaret ettiniz, bu yüzden dizin yığını tarafından depolanan son 10 dizinde olacaklar.
Brian Peterson

benim için işe yaramadı ...
Vass

4

Bir fonksiyon yazabilirsiniz (kabuğun kendisinin, yani çalışma dizininin durumunu değiştirmek istediğiniz için bir fonksiyon olması gerekir; harici bir komut sadece kendi işlemini etkiler).

İşte fiziksel dizin yapısında argüman (varsayılan 1) olarak geçen bir dizi seviyeye çıkacak bir fonksiyon (yani cd -P .., n kere):

up() {
    # default parameter to 1 if non provided
    declare -i d=${@:-1}
    # ensure given parameter is non-negative. Print error and return if it is
    (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
     # remove last d directories from pwd, append "/" in case result is empty
    cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
}

Bu şekilde kullanın:

up 4

1
Bu kod soruyu cevaplayabilse de, neden ve / veya bu kodun soruyu nasıl yanıtladığına ilişkin ek bağlam sağlamak, uzun vadeli değerini iyileştirir.
Donald Duck,

1
Kabul, yardım etmek için birkaç yorum ekledim.
mgild

Nitpicky olmak, varsaymakla up 4gerçekten eşdeğer değil mi? cd /some/dir/$PWD = "/some/dir/that/is/deeply/nested/"
snapfractalpop 15:18

2

Eğer sorduğun ama içine bakmak gerekir değil tam olarak ne pushdve popd. Onları klasör gezintisi için bazı cd...takma adlardan daha yararlı buluyorum

Birkaç sabit alandan ileri geri gidiyorsanız, normal olan takma isimleri kullanmaktır.

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'

1

Diğer ad kullanmak yerine, aşağıdaki bash işlevini de kullanabilirsiniz:

function mcd() {
  up=""

  for ((i=1; i<=$1;i++)); do
    up="${up}../"
  done

  cd $up
}

(ya da bir tek-katmanı olarak: function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; })

Bunu ~/.bashrcdosyaya eklemek , onu terminalinizde kullanılabilir hale getirecek ve ../../../../../../çağrı yapmadan önce bir String yapımı cdda cd -başlangıç ​​dizinine geri dönmeyi mümkün kılacaktır .

Daha yararlı bir uygulama bazı kullanıcı girişi kontrollerini de içerebilir:

function mcd() {
    if [[ $1 -lt 1 ]]; then
        echo "Only positive integer values larger than 1 are allowed!" >&2
        echo -e "\n\tUsage:\n\t======\n\n\t\t# to go up 10 levels in your directory\n\t\tmcd 10\n\n\t\t# to go up just 2 levels\n\t\tmcd 2\n" >&2
        return 1;
    fi  

    up=""

    for ((i=1; i<=$1;i++)); do
        up="${up}../"
    done

    cd $up
}


0

Nadiren kullanılan ortam parametresini deneyin CDPATH. O zaman seviyeyi açıkça ayarlamanız gerekmeyebilir.

Örnek:

$ find workspace -type d
workspace
workspace/project1
workspace/project1/com
workspace/project1/com/java
workspace/project1/com/java/lang

$ CDPATH=".:~/workspace:~/workspace/project1:~/workspace/project1/com:~/workspace/project1/com/java:~/workspace/project1/com/java/lang"
$ cd com
$ pwd
~/workspace/project1/com

Birden fazla projede çalışıyorsanız, CDPATH ayarını projeye özgü bir ortam dosyasına yapabilirsiniz. Ve ek otomasyon için bir şim ile tetikleyin.

Pushd ve oldukça popd kullanma eğilimindeyim. Bir projede alt dizinler yerine proje ağaçları arasında atlama yapmama izin vermek için CDPATH kullanma eğilimindeyim - ama şu anda birkaç büyük proje üzerinde değil, birçok küçük proje üzerinde çalışıyorum. :)


0

Önceden hedef dizindeyseniz:

luna:/tmp % mkdir -p a/b/c/d
luna:/tmp % pwd
/tmp
luna:/tmp % cd a/b/c/d
luna:d % pwd
/tmp/a/b/c/d
luna:d % cd -
luna:/tmp % pwd
/tmp
luna:/tmp % 

0

DirB'ye bir bak . Aşağıdaki şekilde yer imleri oluşturmanıza olanak sağlayan bir BASH komut dosyasıdır:

OPERASYONLAR

  • s Rehber yer imini kaydet
  • Bir yer imine veya adlandırılmış dizine gitmek
  • p bir yer imi / dizinini dir yığının üstüne itin
  • r kaydedilen yer imini kaldır
  • d yer imlerine eklenmiş dizin yolunu gösterme
  • sl dizin yer imlerinin listesini yazdır

Çok basit, çok etkili.


0

@ Grigory'nin yanıtından bir adım daha ileri gidin:

function cd_up() {
if [ -z "$1" ]; then
    cd ..
else
    cd $(printf "%0.s../" $(seq 1 $1 ))
fi
}
alias 'cdd'='cd_up'

Yani :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3

0

Bu aynı sorundan bıktım ve sonuç olarak cd-plus yazdım. Birden fazla dizini cd'lemenizi sağlayan tek bir dosya CLI yardımcı programı.

kullanım

echo `pwd` # /foo/bar/foobar/baz/foobaz/bazfoo
d baz

echo `pwd` # /foo/bar/

0

Aşağıdaki kodu eklemek, üç artı nokta gösterimini onurlandırmak için tamamlanma .bashrcsüresini uzatacakcd

_cd_dot_expansion() {
    local path="${COMP_WORDS[COMP_CWORD]}"

    if [[ "${path}" =~ ^\.{3,} ]]; then
        local dots="${BASH_REMATCH}"
        local levels="${#dots}"
        local tail="${path##*...}"
        local expanded_dots='..'

        # the loop starts at two because the first set of dots is
        # assigned to `expanded_dots` when it is initialized
        for (( i = 2; i < "${levels}"; i++ )); do
            expanded_dots+='/..'
        done

        path="${expanded_dots}${tail}"
        COMPREPLY=( $( compgen -A file "${path}" ) )

        return
    fi

    _cd
}

complete -o nospace -F _cd_dot_expansion cd

Bu pasajı bash kabuğunuzda çalıştırdıktan sonra yazma cd .../ve vurma <TAB>, ../../örneğin iki seviye üstündeki tüm dizinlerin göreli yollarının yolunu tamamlar ve listeler.

Güncelleme : yukarıdaki kodda belirtilen yönteme bash-completionerişebilmek için kurulmalıdır _cd. Çoğu komut satırı paketi yöneticisi aracılığıyla yüklenebilir

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.