CLI aracılığıyla derin iç içe dizinlere hızlı bir şekilde nasıl girilir?


16

cd <directory>Varsa, kullanmanın dizini açacağını biliyoruz !

Ayrıca, cd ..bizi mevcut çalışma dizininden bir seviye yukarı götürecektir.

Ancak, daha uzun bir yola sahip iç içe bir dizinimiz olduğunda /home/thina/teams/td/tech/app/release/apks, sadece klasöre girmek yorucu olur apksve ayrıca başka bir düğüme geri dönmek zordur /home/thina/teams.

Sesli olarak atlamak için herhangi bir yolu var mı cdve cd ..? Ubuntu 16.04 kullanıyorum.


Evet! Sesli olarak atlamak için herhangi bir yolu var mı cdve cd ..?
gsthina

@GSURENDARTHINA Sanırım bir kerede birden fazla seviyeye geri dönerek en az birkaç tuşa basarak tasarruf edebileceğinizi biliyorsunuz, örneğin sizin durumunuzdacd ../../../../..
underscore_d

2
Simgeler bir seçenek midir?
Cepler

1
Ayrıca dokümanlardaki CDPATHdeğişkene bakmak da isteyebilirsiniz bash.
chepner

Farkına varmadığınız takdirde: geçerli çalışma dizinindeki herhangi bir dizin için "cd <dizini>" yapabilirsiniz - eğik çizgi ile başlamayın. Örneğin, çalışma dizininiz şu anda "/ home / thina / teams / td / tech / app / release" ise, sadece "cd apks"
yazarsınız

Yanıtlar:


30

Var pushdve popd:

pushd /home/thina/teams/td/tech/app/release/apks
# current directory now /home/thina/teams/td/tech/app/release/apks
popd
# current directory now what it was before pushd command

Deneyin help pushdve help popddaha fazla seçenek için. manSayfa yoktur , çünkü pushdve popdbash yerleşik komutlarıdır.


5
Olmaz cd -aynı şeyi yapmak?
edwinksl

5
@edwinksl evet, ama pushdve popdbirden fazla önceki yolunu hatırlıyorum.
Jos

8
dirsDizin yığınınızı pushd/ popdkomutları içinde listelemeyi unutmayın .
Arronik

4
Bunlar, bash yerleşik komutları oldukları için bash builtins (7) için manuel sayfada ele alınmıştır. (Ya da bash için tam manuel sayfada da bulunabilirler ) Bu aynı bilgidir help pushdve help popdsiz de bahsettiğiniz gibi (aynı zamanda help dirs), ancak insanların bu komutların nereden geldiğini merak ettiklerini söyleyebilirim.
MT

2
@Jos you misspelledhelp pusdh
Sergiy Kolodyazhnyy

16

Halihazırda sağlanan çok iyi cevaplara ek olarak, cdetkili bir şekilde kullanmayla ilgili bazı ipuçları .

  • cd - sizi bulunduğunuz son dizine geri götürecektir.
  • cd ../../..aynı anda 3 seviye alacak, istediğiniz kadar ..dizinleri 'yukarı taşımak' için birlikte zincirleme gösterimi kullanabilirsiniz .
  • Kaç kez taşımak istediğinizden emin değilseniz cd .., komutunu tekrar kullanmak için ok tuşuna basarak bash geçmişini kullanın.
  • ~Geçerli kullanıcıların giriş dizininde durmak için kullanın , kullanıcı olarak oturum açtıysanız, cd ~/teamssizi/home/thina/teams
  • Yollar için Bash otomatik tamamlamayı kullanın, sekme tuşu komuttaki bir yolun bir bölümünü tamamlar cd, bir yol parçasının bir kısmını ve arkasından yazarsanız Tab, geçerli başka bir seçenek yoksa bu parça tamamlanır. Örneğin, cd /home/thina/teams/td/tdaha sonra yazmış Tabve basmış olsaydınız, td dizininde t harfiyle başlayan başka bir dosya veya dizin olmadığı sürece tech kelimesi sizin için doldurulur.

Bu ipuçlarını birlikte kullanmak cdçok daha az acı çeken dizinleri değiştirebilir .


2
Bu noktaya eklemek ~, özellikle de kök iseniz, ~userhızlı bir şekilde userana dizine götürür.
CVn

Teşekkürler, farkında değildim, bir sonraki düzenlemeye ekleyeceğim.
Arronik

9

Ağaçta bir seferde birkaç seviye yukarı çıkmak için aşağıdaki işlevi kullanabilirsiniz (gelişmiş sürüm için muru sayesinde):

up ()
{
    local old="$PWD"
    for i in $(seq "${1:-1}"); do
        cd ..
    done
    OLDPWD="$old"
}

Sonra şunları yapabilirsiniz:

$ pwd
/home/thina/teams/td/tech/app/release/apks
$ up 5
cd'ing into /home/thina/teams

Bunlara ek olarak:

  • çağrı upbir bağımsız değişken olmadan denktir cd ..dolayı ${1:-1}olan yerine $1, set ve 1başka türlü
  • son davranışın ardından OLDPWD'nin cd ..olağan cd -davranışı korumayı amaçladığı

1
Teknik olarak, bu bir işlevdir, takma ad değildir.
Reinier Post

@ReinierPost: Yeterince doğru! Ben de buna göre düzelttim.
parras

2
Öneriler: -gtyerine >. >sözlükbilimsel, dizge olarak karşılaştırır. Ayrıca, bir yol oluşturmak yerine, neden cd ..bir döngüde yapmıyorsunuz for i in $(seq "${1:-1}"); cd ..; done? Bu da durumu ortadan kaldırabilir if.
muru

@muru Yorumuna katılıyorum gt, ancak ikinci öneri ile ilgili olarak, cevaptaki son madde işaretine bak. Bana mantıklı geldi.
Oliphaunt - Monica

1
@Oliphaunt çok zor değil, sadece OLDPWDorijinal yola geçtiniz . İşte tam bir sürüm: paste.ubuntu.com/17990874
muru

7

Uzun dizin adları için tam yol içeren değişkenler kullanın. Örneğin,

APKS="/home/thina/teams/td/tech/app/release/apks"

Sonra sadece yapabilirsin cd "$APKS"

X dizin sayısını yukarı çıkmaya gelince, bu fonksiyon benim .bashrc

goup() # go up x number of dirs
{
  num=$1
  while [ $num -ne 0  ];do
    cd ..
    num=$( expr $num - 1   )
  done
}

Dönmek için /home/thina/teamsgelen apksyapardın

goup  6

İşte bir kullanım örneği:

$> pwd
/sys/class/backlight/intel_backlight
$> goup 3
$> pwd
/sys
$> 

Ben geldi, ama asla kadar kullanılan başka bir küçük işlevi bookmarkişlevdir.

Şöyle çalışır: geçerli klasörünüzü bir dosyaya kaydeder ve o dosyadaki satır numarasına göre cd'yi belirli bir dizine kaydedebilirsiniz. Misal:

$> cd /etc/lightdm
$> bookmark
$> cat ~/.dirsbookmarks                                                                                                  
/home/xieerqi
/sys/class/backlight
/etc/lightdm
$> cd $( awk 'NR==2' ~/.dirsbookmarks  )                                                                                 
$> pwd
/sys/class/backlight

Ve işte fonksiyonun kendisi:

bookmark()
{ # bookmarks current dir
  pwd >> $HOME/.dirsbookmarks
}

5

GÜNCELLEME: Şundan daha da güçlü bir araç var autojump: fasdama buna aşina değilim.


autojumpHenüz kimsenin bahsetmediğine şaşırdım

komut satırından en çok kullandığınız dizinlerin bir veritabanını koruyarak çalışır (Dizinler atlanmadan önce ziyaret edilmelidir.)

Temel olarak @graipher'ın inşa ettiği şey, birkaç ekstra seçenekle.

Başka bir soruda bahsettiğim gibi :

Bir dizine birkaç kez cd yaptıktan sonra (bir kez bile yeterlidir):

cd /home/thina/teams/td/tech/app/release/apks

jşu anda hangi dizinde olduğunuzdan bağımsız olarak oraya hızlıca gitmek için kısayolu kullanabilirsiniz :

j apks

Not Listede en yüksek bulunuyor sürece, yol eserlerin herhangi bir bölümünü kullanarak bu: j appAyrıca götürecek .../apkssen daha orada daha fazla kez giderse.../app .

İyi korunur, Ubuntu için dağıtılır ve çocuğa atlama gibi diğer düzgün özelliklere sahip olduğundan kendi komut dosyasına sahip olmayı tavsiye ederim :

.../td/tech $ jc apk
.../release/apks $ 

Sizi taşındı apksiçinde tdyerine başka, apksfarklı bir ağacın altında.


'Fasd' için +1. Gerçekten faydalı.
Thomas

4

Takma adlar

Doğrudan takma ad aracılığıyla kullanılabilen sık kullanılan dizinlerin bir listesi var. Bu aynı zamanda hiyerarşideki dizinlerin kısayollarını da içerir.

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias cdwork=/home/knub/Repositories/work
alias cduni=/home/knub/University

Şimdi, üç seviye yukarı çıkmak istediğimde, sadece yazıyorum ....<Enter>ve işte buradayım!


Bunu da beğendim, çünkü ilk başta “3 seviye için hmm 4 periyot ...” diye düşündüm. Sonra “Oh evet ... Bilgisayarlar! 0 , 1, 2, 3!” Diye düşündüm . : D Artık hatırlaması kolay, kullanışlı ve birlikte oynayacağım bir şey. Şerefe!
P Smith

bash_completion ile github.com/bac0n/bash_completion
bac0n

4

Yazmanıza gerek kalmaması için ( ) autocdseçeneğini açın . Örneğin , üst dizine gitmek için sadece iki karakterli komuta ihtiyacınız vardır .shopt -s autocdcd..

İki dizin arasında geziniyorsanız cd -, bunlar arasında bir önceki çalışma dizinine giden geçişler arasında geçiş yapabilirsiniz . autocdYapmaz seçenek -koşmakcd - ama bunun için bir takma ad veya işlevi tanımlayabilirsiniz.

Yerleşik pushdve ile bir yığındaki dizinleri ezberleyebilirsiniz popd. Yerleşik dirsdizin yığınını listeler (buluyorumdirs -v daha okunabilir ).

Belirli bir dizinin alt dizinlerini sık sık değiştirirseniz ve bu alt dizinlerin benzersiz bir adı varsa, bunları CDPATHdeğişkene ekleyin . Ancak hiçbir zaman bir durum bulamadığım konusunda uyarılmalıdır.CDPATH , aslında gerçekten kullanışlı .

Bir değişkeni dizin adına ayarlayabilir ve daha sonra $foo .

Zsh Zsh yükle , bash'ın sahip olmadığı birkaç güzel özelliğe sahiptir. Bazıları aynı işi yapan işlevler yazarak taklit edilebilir. Özellikle iki değişkenli form, cdbenzer bir ada sahip başka bir dizine rahatça geçmenizi sağlar, örneğin /home/thina/teams/td/tech/app/release/apks/com.acme/v1koşmak cd release betaiçin /home/thina/teams/td/tech/app/beta/apks/com.acme/v1.


2

UnixSE ile ilgili bir soruya daha önce yanıtladığım gibi , bunun için z [github] adında bir komut dosyası kullanıyorum .

Cd'ye bağladığınız dizinleri hatırlar, onları frekansa (frekans + yenilik) göre sıralar ve adının bir kısmını kullanarak hatırlanan yollardan birine geçmenizi sağlar.

Bir dizine cd'ed yaptıktan sonra en az bir kez örneğin;

$ cd ~user/very/long/path/with/many/subfolders/

Sadece yap:

$ z sub

kısmi ad eşleşmesini kullanarak çalışır (yolunda alt terimini içeren ve daha yüksek bir frekansa sahip başka bir dizininiz olmadığı varsayılarak).

Ayrıca ilk önce normal bir cd dener ve başarısız olursa z kullanır böyle bir işlevi tanımladı:

function cd() {
    builtin cd "$1" 2> /dev/null || z "$1" || (echo "cd: File or Directory not found: $1" >&2 && exit 1)
}

Bu size her ikisinin de en iyisini verir. Klasör geçerli dizinde ise veya geçerli bir tam yol belirtilmişse, sadece orada cd olur, ancak değilse veritabanında bir eşleşme ve orada cd'de bir eşleşme bulmaya çalışır. Bu, bazen cd kullanmak zorunda kalmanın (veritabanını eğitmek, daha önce hiç gitmediğiniz bir klasöre gitmek) ve bazen z'yi kullanmayı hatırlamanın (küçük) acısını ortadan kaldırır.


Bu bilgilerinizin sık ziyaret edilen dizinlerin veritabanını cdnasıl zoluşturduğunu etkilemediğinden emin misiniz ?
leftaroundabout


@ leftaroundabout: Emin değilim, ancak şu ana kadar güzel çalışıyor. z yerleşik cd (ne zaman benim kurulum ilk dener) kullandığınızda kesinlikle veritabanı oluşturur. Yine de z parçası kullanıldığında veritabanının güncellenip güncellenmediğinden emin değilsiniz. EDIT: Sadece $ builtin cd ~ / klasör / i / have / not / been / to / yet / yaparken veritabanının güncellenip güncellenmediğini test etti. Bu.
Graipher

1
@CiprianTomoiaga Gerçekten de aynı şeyi yapıyormuş gibi görünüyor. Kullandığım cd komutunun üzerine yazmak da bunun için kullanılabilir. autocomplete'ın farklı komutları yine de ilginç görünüyor!
Graipher

btw: Z'nin yazarı değilim, sadece çok yararlı bul.
Graipher

1

İyi çalıştığımı düşündüğüm üç seçenek daha (gelecekte pushddaha fazla kullanabileceğim halde , sadece bunu öğrendim):

  • Yollarınızı, eninde cdsonunda derin yuvalanmış dizinlere girmenize gerek kalmayacak şekilde düzenleyin veya daha doğrusu: bu nedenle sık sık ziyaret etmeniz gereken yerler parmaklarınızın ucunda. Bunu başarmanın yolu sembolik bağlantılardır : açık, hiyerarşik dizinleri olduğu gibi tutun, ancak kendi kolaylığınız için hızlı erişim bağlantısı kurun.

    ln -s ~/teams/td/tech/app/release/apks ~/apks

    Ardından, geri dönmek cdiçin cd ~/apks, ve cd ../teams(veya, bu örnekte tercih edilebilir ~/teams) uzun yolunu yazmak yerine kullanın .

  • Yollar arasında tek bir kabuk ve cd kullanmayın, ancak üzerinde çalışmanız gereken yolların her biri için bir kabuk çalışmasını sağlayın. Bu çoklu görevi gerçekleştirmek için birden çok düzey vardır:

    • Birden çok terminal penceresi kullanın. Pencereler farklı çalışma alanlarında yaşıyorsa en iyi sonucu verir .
    • Tek bir pencerede birden çok sekme kullanın. Bu, belirli bir dizinde yalnızca birkaç komut yapmak için çok uygundur: geri dönmek için terminal sekmesini kapatın!
    • (Gerçekten mantıklı IMO değil, tamlık için :) gibi bir terminal çoklayıcı kullanın tmux.
    • Bir eylemi cd, klasöre giren, orada bir şey yapan ve orijinal klasör üzerinde hemen geri kontrol sağlayan tek amaçlı bir komutta başlatın : yerine

      $ cd /home/thina/teams/td/tech/app/release/apks
      $ some_command this_file_here
      $ cd ../../../../..

      sadece tek astarı yapın

      $ (cd ~/teams/td/tech/app/release/apks; some_command this_file_here)

      Veya eşdeğer olarak

      $ sh -c 'cd ~/teams/td/tech/app/release/apks
      > some_command this_file_here'
  • Yapma cd hiç ama sadece ev dizinden komut hakkına yürütün. Brace genişletmeleri burada çok yardımcı olabilir:

    $ cd /home/thina/teams/td/tech/app/release/apks
    $ some_command this_file_here other_file_also_apks
    $ cd ../../../../..

    yapabilirsin

    $ some_command ~/teams/td/tech/app/release/apks/{this_file_here,other_file_also_apks}

pushdçok faydalıdır. Cevabınızı daha iyi hale getirmek için nasıl kullanılacağı hakkında daha fazla bilgi eklemek isteyebilirsiniz.
Sergiy Kolodyazhnyy

@Serg: evet, ama kendimi sadece pushd biliyorum yukarıdaki Jos' cevabını dan .
leftaroundabout

Ah, anlıyorum. O zaman gelecekteki cevaplar için yararlı olabilir.
Sergiy Kolodyazhnyy

1

İtme ve Açma

Komutlar pushdve popdfavorilerim. pushdKomut komutuyla görüntülenebilir ziyaret ettiğiniz dizinleri, hatırlar dirsgeriye kullanımını atlamak için hazır olduğunuzda, vepopd dönmek için.

İşte bash işlevlerini ve takma adlarını kullanan bir örnek:

sd ()
{
    pushd "$1" > /dev/null
}

po ()
{
    popd
}

alias d='dirs'

Bu komutların bir karışımını sürekli olarak çeşitli şekillerde kullanıyorum.

Takma adlar

Sık erişilen dizinler için başka bir seçenek de cd veya pushdkomutlarını vermektir. Yani, gönderinizdeki örnekleri kullanarak:

alias cdapks='cd /home/thina/teams/td/tech/app/release/apks'
alias cdteams='cd /home/thina/teams'

kombinasyon

İki fikri birleştirin ve hatta buna sahip olabilirsiniz:

alias sdapks='sd /home/thina/teams/td/tech/app/release/apks'
alias sdteams='sd /home/thina/teams'

Bu da size çapraz dizinlerde çok fazla esneklik sağlar. Ben tutmak cd***ve sd***benzeri şeyler için ise takma adlarını Desktop, Documents, Music, Downloads, vb ve çok kullanışlı!


1

Deneyin z.lua - Alışkanlıklarınızı öğrenerek daha hızlı gezinmenize yardımcı olan yeni bir cd komutu.

  • cd bir dizine foo içerir:

    z foo
  • cd bir dizine foo ile biter:

    z foo$
  • birden fazla argüman kullanın:

    Aşağıdaki veritabanını varsayarsak:

    10   /home/user/work/inbox
    30   /home/user/mail/inbox

    "z in"/home/user/mail/inboxyüksek ağırlıklı giriş olarak cd . Ancak, farklı bir girişi tercih etmek için z.lua'ya birden fazla argüman iletebilirsiniz. Yukarıdaki örnekte, "z w in"dizini olarak değiştirir /home/user/work/inbox.

  • Etkileşimli seçim içeren cd:

    Birden fazla eşleşme bulunduğunda, kullanıldığında z -ibir liste görüntülenir:

    $ z -i soft
    3:  0.25        /home/data/software
    2:  3.75        /home/skywind/tmp/comma/software
    1:  21          /home/skywind/software
    > {CURSOR}

    Ardından numarayı girebilir ve gerçek cd'den önce nereye gideceğinizi seçebilirsiniz. Örneğin. cd'ye 3 girişi/home/data/software . Ve sadece ENTER tuşuna basıp hiçbir şey girmezseniz, sadece çıkıp bulunduğunuz yerde kalacaktır.

    z.lua ayrıca destekler fzf etkileşimli seçim veya bağımsız değişken tamamlamayı :

    fzf ile tamamlama

  • hızlı yazmadan ebeveyne geri dön cd ../../.. :

    Yeni seçenek "-b"artık "cd ../../ .." yazmak yerine bash içindeki belirli bir üst dizine hızla geri dönebilir:

    • (cd Bağımsız değişken yok) : proje köküne, proje kökünde .git/ .hg/ .svnbulunan en yakın üst dizini kök .

    • (Bir bağımsız değişken) : cdanahtar kelimeyle başlayan en yakın üst öğeye, bulamazsa, anahtar kelime içeren üst öğeye gidin.

    • (İki bağımsız değişken) : ilk değeri ikinci değerle (geçerli yolda) değiştirir.

    ...

    En aliasing başlayalım z -biçin zb:

    # go all the way up to the project root (in this case, the one that has .git in it)
    ~/github/lorem/src/public$ zb
      => cd ~/github/lorem
    
    # cd into to the first parent directory named g*
    ~/github/vimium/src/public$ zb g
      => cd ~/github
    
    # substitute jekyll with ghost
    ~/github/jekyll/test$ zb jekyll ghost
      => cd ~/github/ghost/test

İhtiyacınıza uygun olmasını diliyorum.


0

balık hızla hareket etmek için birkaç güzel tesisleri vardır.

  • Cd sağ ok enter yazarsanız, en son cd'yi tekrarlar.
  • Cd yukarı ok sağ ok enter tuşlarını kullanarak en son ikinci cd'yi tekrarlar.
  • Vb.
  • Prevd ve nextd, genellikle pushd ve popd'den daha kolay kullanılır.

Ayrıca, ~ / f için favori dizinlerimi symlinked, böylece ~ / foo / bar / baz / deneysel-veri almak için cd ~ / f / x olabilir.


0

Uzun zamandır sık ​​erişilen dizinler için takma adlar kullandım.

Ayrıca ccb (cd bat dosyası oluşturmak için kısa - bu dos / windows kaynaklı .bat kabuk komut dosyası ccb.bat geçerli dizine atlamak için başka bir .bat dosyası oluşturur) adlı bir bash işlevi var / takma adlar ekler (.bash_aliases dosyasında) geçerli dizine kopyalayın.

örneğin: $ ccb myfav, .bash_aliases dosyasında bir takma ad myfav ile geçerli dizine bir takma ad oluşturur ve .bashrc dosyasını kaynak olarak takma adı hemen kullanılabilir hale getirir.

Şimdi yeni bir çözüm buldum. Bu bir bash işlevi

## USAGE : lj <your_dir>
### lj -- short for LongJump -- (kinda similar to a C function which would jump to an address outside of your current function)
function lj() {
        pushd `find . -type d -name $1 -print | head -n 1`
}

$ lj deeply_nested_dir_name

bunun önceki kullanımdan bir şey öğrenmesi gerekmez. Bunun çözemeyeceği sorun şudur: alt dizin ağacında "deeply_nested_dir_name" adında 1'den fazla dizin varsa, find tarafından bulunan dizinin ilkine atlar.

Ayrıca, bu çözüm başka bir dizin ağacına gidemeyecektir.

kodlanmış takma adlar ve oluşturulan takma adlar ve bu yeni lj () işlevi arasında, çoğu ihtiyacım halledilir.

İşte kullanmak isteyen herkes için benim ccb () bash işlevi

function ccb() {
        foo=$PWD
        echo "" >> ~/.bash_aliases
        echo "alias $1='pushd $foo > /dev/null'" >> ~/.bash_aliases
        source ~/.bashrc
}
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.