Bagaimana cara cepat pindah ke dan dari direktori yang sangat bersarang melalui CLI?

16

Kita tahu bahwa menggunakan cd <directory>akan membuka direktori, jika ada!

Juga, cd ..akan membawa kita naik satu tingkat dari direktori kerja saat ini.

Tetapi, ketika kita memiliki direktori bersarang dengan path yang lebih panjang seperti /home/thina/teams/td/tech/app/release/apks, itu melelahkan untuk hanya masuk ke folder apksdan juga sulit untuk kembali ke node lain, katakan di sini /home/thina/teams.

Apakah ada cara untuk melewati pengetikan cddan cd ..? Saya menggunakan Ubuntu 16.04.

gsthina
sumber
Ya! Apakah ada cara untuk melewati pengetikan cddan cd ..?
gsthina
@GSURENDARTHINA Saya kira Anda tahu Anda dapat menyimpan setidaknya beberapa penekanan tombol dengan kembali beberapa tingkat sekaligus, misalnya dalam kasus Andacd ../../../../..
underscore_d
2
Apakah symlinks merupakan opsi?
Kantong
1
Anda mungkin juga ingin melihat CDPATHvariabel dalam bashdokumen.
chepner
Kalau-kalau Anda tidak menyadari: Anda dapat melakukan "cd <directory>" untuk direktori apa saja di direktori kerja saat ini - jangan mulai dengan sebuah slash. Jadi untuk contoh Anda, jika direktori kerja Anda saat ini "/ home / thina / teams / td / tech / app / release" Anda cukup mengetik "cd apks"
jcadcell

Jawaban:

30

Ada pushddan 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

Coba help pushddan help popduntuk lebih banyak opsi. Tidak ada manhalaman, karena pushddan popdadalah perintah built-in bash.

Jos
sumber
5
Tidak akan cd -melakukan hal yang sama?
edwinksl
5
@edwinksl ya, tetapi pushddan popddapat mengingat lebih dari satu jalur sebelumnya.
Jos
8
Jangan lupa dirsuntuk mendaftar tumpukan direktori Anda di dalam perintah pushd/ popd.
Arronik
4
Ini tercakup di halaman manual untuk bash-builtin (7) karena mereka adalah perintah built-in bash. (Atau mereka juga dapat ditemukan di halaman manual penuh untuk pesta ) Ini adalah info yang sama dengan help pushddan help popdAnda sebutkan (serta help dirs) tapi saya pikir saya akan menyebutkan bahwa dalam kasus orang ingin tahu di mana perintah ini berasal.
MT
2
@Jos Anda salah ejahelp pusdh
Sergiy Kolodyazhnyy
16

Selain jawaban yang sangat baik yang telah disediakan, berikut adalah beberapa kiat untuk menggunakan cdsecara efektif.

  • cd - akan membawa Anda kembali ke direktori terakhir tempat Anda berada.
  • cd ../../..akan membawa Anda naik 3 level sekaligus, Anda dapat menggunakan ..notasi dirantai bersama untuk 'naik' direktori sebanyak yang Anda suka.
  • Jika Anda tidak yakin berapa kali ingin naik, gunakan cd .., lalu gunakan bash history dengan menekan tombol panah untuk menggunakan perintah lagi.
  • Gunakan ~untuk berdiri di direktori home pengguna saat ini, jika Anda login sebagai pengguna thina cd ~/teams, akan membawa Anda ke/home/thina/teams
  • Gunakan Bash penyelesaian otomatis untuk jalur, tombol tab akan menyelesaikan bagian dari jalur di cdperintah, jika Anda mengetik bagian dari segmen jalur diikuti oleh Tab, segmen itu akan selesai jika tidak ada pilihan lain yang valid. Misalnya, jika Anda telah mengetik cd /home/thina/teams/td/tlalu menekan Tab, kata tech akan diisi untuk Anda, selama tidak ada file atau direktori lain di direktori td yang dimulai dengan huruf t.

Menggunakan tip-tip ini bersama-sama dapat membuat direktori traverse dengan cdjauh lebih menyakitkan.

Arronikal
sumber
2
Menambahkan ke titik ~, terutama jika Anda root, ~userakan dengan cepat membawa Anda ke userdirektori home.
CVn
Terima kasih, saya tidak menyadarinya, saya akan menambahkannya di edit berikutnya.
Arronical
9

Untuk naik di pohon beberapa level sekaligus, Anda dapat menggunakan fungsi berikut (terima kasih untuk muru untuk versi yang disempurnakan):

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

Maka Anda dapat melakukan:

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

Selain itu:

  • panggilan uptanpa argumen sama dengan cd ..karena ${1:-1}pengganti yang $1diatur saat dan 1sebaliknya
  • pengaturan OLDPWD setelah cd ..tujuan terakhir untuk mempertahankan cd -perilaku yang biasa .
parras
sumber
1
Secara teknis, ini adalah fungsi, bukan alias.
Reinier Post
@ReinierPost: Cukup benar! Saya sudah mengoreksi sesuai.
parras
2
Saran: -gtalih-alih >. >adalah leksikografis, ia membandingkan sebagai string. Juga, bukan membangun jalan, mengapa tidak melakukan cd ..dalam satu lingkaran: for i in $(seq "${1:-1}"); cd ..; done? Itu bisa menghilangkan ifkondisinya juga.
muru
@uru Saya setuju dengan gtkomentar Anda , tetapi mengenai saran kedua Anda, lihat jawaban terakhir dalam jawabannya. Masuk akal bagi saya.
Oliphaunt - mengembalikan Monica
1
@Oliphaunt itu tidak terlalu sulit, Anda hanya mengatur OLDPWDke jalur asli. Ini versi lengkapnya: paste.ubuntu.com/17990874
muru
7

Untuk nama direktori yang panjang, gunakan variabel dengan path lengkap. Sebagai contoh,

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

Maka Anda bisa melakukannya dengan adil cd "$APKS"

Adapun naik x jumlah direktori, saya memiliki fungsi ini didefinisikan dalam .bashrc

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

Untuk kembali /home/thina/teamsdari apksAnda akan lakukan

goup  6

Berikut ini contoh penggunaan:

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

Fungsi kecil lain yang saya buat, tetapi tidak pernah banyak digunakan adalah bookmarkfungsi.

Begini cara kerjanya: ia menyimpan folder Anda saat ini untuk beberapa file, dan kemudian Anda dapat cd ke direktori tertentu berdasarkan nomor baris dalam file itu. Contoh:

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

Dan inilah fungsinya sendiri:

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

UPDATE: Ada alat yang bahkan lebih kuat daripada autojump: fasd, tapi saya tidak terbiasa dengan hal itu.


Saya terkejut tidak ada yang disebutkan autojumpbelum yang

berfungsi dengan memelihara database direktori yang paling sering Anda gunakan dari baris perintah (Direktori harus dikunjungi terlebih dahulu sebelum dapat dilompati.)

Pada dasarnya apa yang telah dibangun oleh @graipher, dengan beberapa opsi tambahan.

Seperti yang telah saya sebutkan pada pertanyaan lain:

Setelah Anda melakukan cd beberapa kali ke direktori (bahkan cukup sekali saja):

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

Anda dapat menggunakan jalan pintas juntuk pindah ke sana dengan cepat, terlepas dari direktori tempat Anda berada saat ini:

j apks

Perhatikan bahwa menggunakan bagian mana pun dari jalur berfungsi, asalkan itu yang tertinggi dalam daftar: j appjuga akan membawa Anda ke .../apksjika Anda pergi ke sana lebih banyak daripada untuk .../app.

Saya akan merekomendasikan itu daripada memiliki skrip Anda sendiri karena itu dikelola dengan baik, didistribusikan untuk Ubuntu, dan memiliki fitur rapi lainnya, seperti lompat ke anak :

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

Telah pindah Anda untuk apksdi td, daripada beberapa lainnya apksdi bawah pohon yang berbeda.

Ciprian Tomoiagă
sumber
+1 untuk 'fasd'. Ini sangat berguna.
Thomas
4

Alias

Saya memiliki daftar direktori yang sering digunakan, langsung tersedia melalui alias. Ini juga termasuk jalan pintas untuk direktori di hierarki.

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

Sekarang, ketika saya ingin naik tiga level, saya cukup mengetik ....<Enter>dan itu dia!

rajut
sumber
Saya juga suka ini, karena walaupun pada awalnya saya berpikir "hmm 4 periode untuk 3 level ..." kemudian saya berpikir, "Oh ya ... Komputer! 0 , 1, 2, 3!" : D Sekarang mudah diingat, berguna, dan sesuatu yang akan saya mainkan juga. Bersulang!
P Smith
github.com/bac0n/bash_completion dengan bash_completion
bac0n
4

Aktifkan autocdopsi ( shopt -s autocd), sehingga Anda tidak perlu mengetik cd. Misalnya, Anda hanya perlu perintah dua karakter ..untuk masuk ke direktori induk.

Jika Anda menavigasi antara dua direktori, Anda dapat beralih di antara mereka dengan cd -, yang pergi ke direktori kerja sebelumnya. The autocdpilihan tidak membuat -run cd -tetapi Anda dapat menentukan alias atau fungsi untuk itu.

Anda dapat mengingat direktori pada tumpukan dengan builtin pushddan popd. Builtin dirsmendaftar tumpukan direktori (saya menemukan dirs -vlebih mudah dibaca).

Jika Anda sering berganti ke subdirektori dari direktori tertentu, dan subdirektori ini memiliki nama yang agak unik, tambahkan ke CDPATHvariabel. Namun berhati-hatilah bahwa saya tidak pernah menemukan situasi di mana CDPATHsebenarnya berguna.

Anda dapat mengatur variabel ke nama direktori dan kemudian mengubahnya dengan $foo.

Zsh Instal zsh memiliki beberapa fitur bagus yang tidak dimiliki oleh bash. Beberapa dari mereka dapat ditiru dengan menulis fungsi yang melakukan pekerjaan yang sama. Secara khusus bentuk dua argumen cdmemungkinkan Anda dengan mudah mengubah ke direktori lain dengan nama yang sama, misalnya dari /home/thina/teams/td/tech/app/release/apks/com.acme/v1, menjalankan cd release betapergi ke /home/thina/teams/td/tech/app/beta/apks/com.acme/v1.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Karena saya sudah menjawab pertanyaan terkait UnixSE, saya menggunakan skrip bernama z [github] untuk ini.

Ia mengingat direktori tempat Anda cd, memberi peringkatnya berdasarkan frecency (frekuensi + kebaruan) dan memungkinkan Anda untuk mengubah ke salah satu jalur yang diingat menggunakan beberapa bagian dari namanya.

Setelah di-cd ke direktori setidaknya sekali Anda bisa melakukan misal alih-alih:

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

Lakukan saja:

$ z sub

yang akan bekerja, menggunakan pencocokan nama parsial (dengan asumsi Anda tidak memiliki direktori lain yang mengandung di dalamnya sub istilah dan yang memiliki frekuensi lebih tinggi).

Saya juga mendefinisikan fungsi seperti ini, yang pertama kali mencoba cd normal dan jika gagal menggunakan z:

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

Ini memberi Anda yang terbaik dari keduanya. Jika folder ada di direktori saat ini atau path lengkap yang valid diberikan, itu hanya akan cd di sana, tetapi jika tidak akan mencoba untuk menemukan kecocokan dalam database dan cd di sana. Ini menghilangkan rasa sakit (kecil) dari terkadang harus menggunakan cd (untuk melatih basis data, pergi ke folder yang belum pernah Anda kunjungi sebelumnya) dan kadang-kadang mengingat untuk menggunakan z, jika berlaku.

Graipher
sumber
Apakah Anda yakin ini cdmilik Anda tidak mengganggu bagaimana zmembangun database direktori yang sering dikunjungi?
leftaroundabout
bagaimana bedanya autojump?
Ciprian Tomoiagă
@leftaroundabout: Tidak yakin, tapi sejauh ini sudah berfungsi dengan baik. z pasti membangun basis data setiap kali Anda menggunakan cd bawaan (yang coba saya setup terlebih dahulu). Namun tidak begitu yakin apakah basis data diperbarui ketika bagian z digunakan. EDIT: Baru saja menguji apakah database diperbarui ketika melakukan $ builtin cd ~ / folder / i / have / not / been / to / yet /. Ini.
Graipher
1
@ CiprianTomoiaga Memang, pada dasarnya sepertinya melakukan hal yang sama. Timpa perintah cd yang saya gunakan juga bisa digunakan untuk itu. Perintah autocomplete yang berbeda tampak menarik!
Graipher
btw: Saya bukan penulis z, hanya merasa sangat berguna.
Graipher
1

Tiga opsi lagi yang saya temukan berfungsi dengan baik (meskipun saya mungkin di masa depan menggunakan pushdlebih banyak, saya baru saja belajar tentang itu):

  • Atur jalur Anda sehingga Anda tidak perlu ke cddirektori yang bersarang di tempat pertama, atau lebih tepatnya: sehingga lokasi yang perlu Anda kunjungi sering tepat di ujung jari Anda. Cara untuk mencapai hal ini adalah dengan symlink : pertahankan direktori yang eksplisit dan ters hierarki dengan baik, tetapi buat tautan akses cepat untuk kenyamanan Anda sendiri.

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

    Kemudian, alih-alih mengetik jalur panjang ke cd, cukup gunakan cd ~/apks, dan cd ../teams(atau, dalam contoh itu preferrable, ~/teams) untuk kembali.

  • Jangan gunakan satu shell dan cd bolak-balik di antara jalur, tetapi tetap menjalankan satu shell untuk setiap jalur yang Anda butuhkan. Ada beberapa level untuk mencapai multitasking ini:

    • Gunakan beberapa jendela terminal. Berfungsi paling baik jika windows hidup di ruang kerja yang berbeda .
    • Gunakan banyak tab dalam satu jendela. Ini sangat cocok untuk hanya melakukan beberapa perintah di beberapa direktori: untuk kembali, cukup tutup tab terminal!
    • (IMO tidak masuk akal, tapi untuk kelengkapan :) gunakan seperti terminal multiplexer tmux.
    • Hanya meluncurkan tindakan dalam perintah tujuan tunggal yang cdmasuk ke folder, melakukan satu hal di sana dan segera memberikan kontrol kembali pada folder asli: alih-alih

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

      cukup lakukan satu-liner

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

      atau setara

      $ sh -c 'cd ~/teams/td/tech/app/release/apks
      > some_command this_file_here'
  • Jangan cd sama sekali , tetapi cukup jalankan perintah langsung dari direktori home Anda. Perluasan Brace dapat banyak membantu di sini: Alih-alih

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

    Anda dapat melakukan

    $ some_command ~/teams/td/tech/app/release/apks/{this_file_here,other_file_also_apks}
leftaroundabout
sumber
pushdsangat bermanfaat sekali. Anda mungkin ingin menambahkan lebih banyak info tentang bagaimana menggunakannya untuk membuat jawaban Anda lebih baik.
Sergiy Kolodyazhnyy
@Erg: ya, tapi saya sendiri tahu pushd hanya dari jawaban Jos 'di atas .
leftaroundabout
Ah, saya melihatnya. Yah, mungkin itu berguna untuk jawaban di masa depan.
Sergiy Kolodyazhnyy
1

Pushd dan Popd

Perintah pushddan popdadalah favorit saya. The pushdperintah akan ingat direktori yang dikunjungi, dapat dilihat dengan perintah dirs, dan ketika Anda siap untuk melompat ke belakang menggunakan popduntuk kembali.

Berikut ini contoh menggunakan fungsi bash dan alias:

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

po ()
{
    popd
}

alias d='dirs'

Saya terus-menerus menggunakan campuran dari perintah-perintah ini dalam berbagai cara.

Alias

Pilihan lain untuk direktori yang sering diakses adalah dengan hanya alias cdatau pushdperintah. Jadi, gunakan contoh dari pos Anda:

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

Kombinasi

Gabungkan dua ide dan Anda bahkan dapat memiliki ini:

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

Yang kemudian memberi Anda banyak fleksibilitas dalam melintasi direktori. Saya menjaga cd***dan sd***alias di tangan untuk hal-hal seperti Desktop, Documents, Music, Downloads, dll dan itu sangat berguna!

tniles
sumber
1

Coba z.lua - Perintah cd baru yang membantu Anda menavigasi lebih cepat dengan mempelajari kebiasaan Anda.

  • cd ke direktori berisi foo:

    z foo
  • cd ke direktori berakhir dengan foo:

    z foo$
  • gunakan beberapa argumen:

    Dengan asumsi database berikut:

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

    "z in"akan masuk /home/user/mail/inboxsebagai entri berbobot lebih tinggi. Namun Anda dapat meneruskan beberapa argumen ke z.lua untuk memilih entri yang berbeda. Dalam contoh di atas, "z w in"lalu akan mengubah direktori menjadi /home/user/work/inbox.

  • cd dengan pilihan interaktif:

    Ketika ada beberapa kecocokan yang ditemukan, menggunakan z -iakan menampilkan daftar:

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

    Kemudian Anda dapat memasukkan nomor dan memilih ke mana harus pergi sebelum cd yang sebenarnya. misalnya. masukan 3 ke cd ke /home/data/software. Dan jika Anda hanya menekan ENTER dan tidak memasukkan apa pun, itu hanya akan berhenti dan tetap di tempat Anda.

    z.luajuga mendukung fzfuntuk pemilihan interaktif atau penyelesaian argumen:

    selesai dengan fzf

  • cepat kembali ke orang tua tanpa mengetik cd ../../..:

    Opsi baru "-b"dapat dengan cepat kembali ke direktori induk tertentu di bash alih-alih mengetik "cd ../../ .." secara berlebihan:

    • (Tidak ada argumen) : cdke dalam root proyek, root proyek direktori induk terdekat dengan .git/ .hg/ .svndi dalamnya.

    • (Satu argumen) : cdke induk terdekat yang dimulai dengan kata kunci, jika tidak ditemukan, buka induk yang berisi kata kunci.

    • (Dua argumen) : ganti nilai pertama dengan yang kedua (di jalur saat ini).

    ...

    Mari kita mulai dengan aliasing z -bke 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

Berharap itu bisa sesuai dengan kebutuhan Anda.

skywind3000
sumber
0

ikan memiliki beberapa fasilitas bagus untuk bergerak dengan cepat.

  • Jika Anda mengetikkan cd panah kanan masuk, ia mengulangi cd terbaru.
  • Dengan menggunakan cd panah atas masukkan panah kanan, ia mengulangi cd terbaru kedua.
  • Dll
  • Ini memiliki prevd dan nextd, yang seringkali lebih mudah digunakan daripada pushd dan popd.

Juga, saya menjaga direktori favorit saya tetap terhubung ke ~ / f, jadi saya bisa cd ~ / f / x untuk sampai ke ~ / foo / bar / baz / data eksperimen.

Theodore Norvell
sumber
0

Saya sudah lama menggunakan alias untuk direktori yang sering diakses.

Saya juga memiliki fungsi bash yang disebut ccb (kependekan untuk membuat file bat cd - ini berasal dari dos / windows di mana script .bat shell ccb.bat akan membuat file .bat lain untuk melompat ke direktori saat ini) yang membuat / menambahkan alias (dalam file .bash_aliases) ke direktori saat ini.

misalnya: $ ccb myfav akan membuat alias ke direktori saat ini dengan alias myfav di file .bash_aliases dan sumber file .bashrc sehingga alias segera tersedia.

Saya baru saja menemukan solusi baru. Ini fungsi bash

## 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

ini tidak perlu belajar apa pun dari penggunaan sebelumnya. Masalah yang mungkin tidak dipecahkan ini adalah: jika ada lebih dari 1 direktori bernama "deep_nested_dir_name" di pohon sub-direktori, maka ia akan melompat ke 1 direktori yang ditemukan oleh find.

Juga, solusi ini tidak akan bisa kebagian pohon direktori lain.

antara hardcod alias atau dihasilkan alias dan fungsi lj () baru ini, sebagian besar kebutuhan saya diurus.

Inilah fungsi ccb () saya untuk siapa saja yang ingin menggunakannya

function ccb() {
        foo=$PWD
        echo "" >> ~/.bash_aliases
        echo "alias $1='pushd $foo > /dev/null'" >> ~/.bash_aliases
        source ~/.bashrc
}
anjanb
sumber